8.2.6 暫停游戲
稍后我們將介紹如何使用_gameOver變量,現(xiàn)在先簡單地將對_paused變量的處理進行包裝。通過一個標準的名為Paused的公共屬性過程,使在類外可以訪問該變量。為了使它實際有效,我們對Advance函數(shù)進行重寫,如程序清單8-13所示。
程序清單8-13 實現(xiàn)暫停功能
/// <summary>
/// Advance the simulation by one frame
/// </summary>
public override void Advance()
{
// If we are paused then do nothing...
if (_paused) return;
// Otherwise get the base class to process as normal
base.Advance();
}
您可能會記得,游戲引擎中的Advance函數(shù)是用于推進整個引擎向前運行的,在基類代碼中,游戲本身以及所有的游戲?qū)ο蠖紩{(diào)用Update函數(shù),使所有事物保持移動。
當將_paused變量設置為true時,就阻止了對基類的調(diào)用,從而使游戲暫停。這樣會使得游戲本身及游戲?qū)ο蟛话l(fā)生任何更新,不再進行任何進一步的移動——正是暫停游戲所需要的。只要將_paused標志設置為false,就會重新調(diào)用base.Advance函數(shù),游戲就會恢復運行。
8.2.7 顯示用于玩家控制的寶石
游戲區(qū)域現(xiàn)在是空的,所以接下來要允許玩家在其中做一些操作。當游戲開始時就隨機生成一對寶石,將它們放在游戲區(qū)域頂部的中間。然后寶石會逐漸向游戲區(qū)域的底部下落。
1. 對CObjGem類進行完善
為了保證游戲知道如何處理寶石的移動,我們首先要為CObjGem類添加一些新的函數(shù)。寶石有3種狀態(tài):在玩家控制中、落在游戲區(qū)域的底部以及顯示在Next piece中(為玩家顯示接下來的寶石的顏色)。
我們需要以不同的方式對各種類型的寶石進行處理。玩家控制中的寶石是漸漸地向游戲區(qū)域的底部降落。落在游戲區(qū)域底部的寶石大部分時間都是靜止的,但當下方產(chǎn)生了空缺時它們就會快速地落下。在Next piece中顯示的寶石完全是靜止的,不會發(fā)生任何移動。
這樣,每個寶石實例就知道該做何操作,我們創(chuàng)建一個名為GemTypes的枚舉,為每一種類型設置一個枚舉值,并且定義一個類級別的變量來保存每個對象的類型(并提供了一個公共屬性供外部訪問)。該枚舉及變量的定義如程序清單8-14所示。
程序清單8-14 _gemType變量及GemTypes枚舉
// The type of gem represented within this object...
private GemTypes _gemType;
// Possible gem types are:
public enum GemTypes
{
OnTheBoard, // A gem that has been placed on to the game board
PlayerControlled, // A gem that is moving under player control
NextGem // A gem in the "next piece" display
};
這樣寶石就可以平滑地下落,而不是每次都對整個游戲區(qū)域進行刷新,我們再進一步添加兩個變量:_fallDistance及_fallSpeed。_fallDistance變量用來存儲寶石在當前位置(保存在我們已經(jīng)討論過的_boardXPos變量與_boardYPos變量中)時與底部之間的距離。因此_fallDistance為0就意味著寶石已經(jīng)到達目標位置;大于0就表示它尚未落地。
該變量中的距離以游戲單位而不是像素進行計量。這樣符合我們的抽象坐標系。我們可以通過設置_fallDistance變量為0.5,從而可以在行的中間繪制寶石,不需要知道實際對應了屏幕上多少個像素。
當玩家控制的寶石在運動中時,就將其_boardYPos設置為它降落時所在的位置,將其_fallDistance值初始設置為1。當每次調(diào)用寶石的Update方法時,令_fallDistance值遞減,就可以使寶石自動向下降落。
寶石降落速度越快,就越難對它進行控制??焖僖苿拥膶毷瘜⑹雇婕覜]有太多的機會考慮將寶石落在哪個位置上,從而錯誤增多。這也是我們隨著游戲的進行提高游戲難度的一種方式。
我們用_fallSpeed變量來設置寶石降落的速度。每次更新時需要從_fallDistance變量中減去該值,如程序清單8-15中所做的那樣。只對玩家控制的寶石做這些操作,Next piece中的寶石不發(fā)生移動。在本章的后文中我們將會介紹游戲區(qū)域中的寶石該如何處理。