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