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