3. 啟動(dòng)時(shí)的初始化
當(dāng)游戲首次運(yùn)行時(shí),可能需要做一系列工作:加載圖形、準(zhǔn)備一個(gè)成績(jī)排行榜表格、或者設(shè)置游戲控制按鈕。
我們將這些工作分為兩類:只在游戲首次加載時(shí)發(fā)生一次的工作,和潛在的每次游戲開(kāi)始后要重復(fù)做的工作。
像準(zhǔn)備成績(jī)排行榜表格這樣的功能需要在類的構(gòu)造函數(shù)中完成,不需要重寫任何游戲引擎函數(shù)。
那些可能需要再實(shí)現(xiàn)的功能可以放置到重寫的Prepare函數(shù)中(參見(jiàn)程序清單4-4)。在引擎進(jìn)程的特定階段會(huì)再次調(diào)用該函數(shù);例如,當(dāng)窗體大小發(fā)生改變時(shí),會(huì)再次調(diào)用Prepare方法。因此,這就是說(shuō)在該方法中要根據(jù)窗體的尺寸加載不同的圖形,并且要根據(jù)窗體尺寸設(shè)置一個(gè)游戲坐標(biāo)系。在第9章使用該引擎構(gòu)建一個(gè)游戲時(shí)我們會(huì)詳細(xì)介紹。
如果您想支持多套不同的圖形集,那么在每次修改了選定的圖形后,也可以從游戲代碼中調(diào)用Prepare函數(shù)來(lái)重新初始化這些圖形。
基類本身并不執(zhí)行任何準(zhǔn)備工作,所以可以只提供一個(gè)空的虛函數(shù),讓繼承類可以對(duì)其重寫。
程序清單4-4 Prepare 函數(shù)
/// <summary>
/// Virtual function to allow the game to prepare itself for rendering.
/// This includes loading graphics, setting coordinate systems, etc.
/// </summary>
public virtual void Prepare()
{
// Nothing to do for the base class.
}
4. 重置游戲
該函數(shù)用于準(zhǔn)備引擎狀態(tài),使一個(gè)新游戲可以開(kāi)始運(yùn)行。該函數(shù)中要完成的任務(wù)包括將玩家得分重置為0并且進(jìn)行清除,或者隨機(jī)設(shè)置一個(gè)游戲難度。上一次游戲中產(chǎn)生的任何信息都要被清空,這樣才不會(huì)對(duì)啟動(dòng)中的新游戲產(chǎn)生影響。
要對(duì)類的構(gòu)造函數(shù)進(jìn)行修改來(lái)使類在實(shí)例化時(shí)能夠調(diào)用Reset函數(shù)。
與Prepare函數(shù)一樣,我們也可以在基類中提供一個(gè)名為Reset的空的虛函數(shù),這樣所有從該類繼承的引擎類都能夠?qū)ζ溥M(jìn)行重寫來(lái)執(zhí)行這些任務(wù)。
5. 渲染
一旦游戲完成對(duì)自身的更新,就需要將游戲中所有需要的元素呈現(xiàn)到屏幕上。我們將調(diào)用一個(gè)名為Render的函數(shù)來(lái)執(zhí)行該工作。正如您將會(huì)看到的,與渲染類型相關(guān)的繼承類會(huì)重寫該函數(shù),然后執(zhí)行繼承引擎本身所需要的所有工作,同時(shí)讓使用此引擎的游戲盡可能的簡(jiǎn)單。
與游戲重置一樣,在基類中實(shí)際不需要做任何工作,所以我們只用簡(jiǎn)單地提供一個(gè)空的虛函數(shù)即可。
6. 更新游戲狀態(tài)
所有與游戲相關(guān)的游戲功能將作為一個(gè)整體(如檢測(cè)游戲是否已經(jīng)結(jié)束)在Update函數(shù)中執(zhí)行。我們的游戲會(huì)重寫該函數(shù)來(lái)執(zhí)行需要的任務(wù),但是同樣,在基類中什么也不做,所以保留該函數(shù)為空。