構(gòu)造函數(shù)將提供的gameForm對(duì)象的引用存儲(chǔ)在類級(jí)別私有變量_gameForm中。為了徹底對(duì)這些對(duì)象進(jìn)行控制,我們將所有類級(jí)別變量的訪問類型定義為private,然后提供相應(yīng)的屬性供類以外的代碼進(jìn)行訪問。因此,我們還需要添加一個(gè)屬性,這樣該基類以外的代碼也可以獲取對(duì)該窗體的引用。
我們將為該窗體對(duì)象提供一個(gè)公共的只讀屬性。由于是屬性被設(shè)置為公共的,因此本引擎程序集中以及其他外部游戲程序集中任何從這里繼承的類都可以訪問該窗體對(duì)象,如程序清單4-2所示。
程序清單4-2 最初的CGameEngineBase 類
/// <summary>
/// Return our game form object
/// </summary>
public Form GameForm
{
get
{
// Return our game form instance
return _gameForm;
}
}
現(xiàn)在我們已經(jīng)解決了“如何創(chuàng)建引擎”的問題,接下來看看需要為該類提供的功能。首先,要為該類添加兩部分主要功能:對(duì)象管理及游戲功能。我們先來看對(duì)象管理部分。
1. 管理游戲?qū)ο?/strong>
游戲中的每個(gè)對(duì)象都代表了屏幕上一個(gè)單獨(dú)的圖形實(shí)體。每個(gè)對(duì)象在屏幕上有一個(gè)位置,并且知道如何對(duì)自己進(jìn)行繪制,也知道如何進(jìn)行移動(dòng)。
我們將在游戲引擎中保存一個(gè)集合,將任意時(shí)刻游戲中所有活動(dòng)的對(duì)象包含到該集合中。這樣當(dāng)需要某個(gè)對(duì)象做一些事情時(shí),引擎就能夠與它進(jìn)行交互。
在游戲中可以向游戲環(huán)境中添加新的對(duì)象,只需要?jiǎng)?chuàng)建這一個(gè)對(duì)象,并且把它添加到對(duì)象集合中。這種方式可以簡(jiǎn)單靈活地處理潛在的大量的對(duì)象:每次想在游戲中添加點(diǎn)東西時(shí),我們只要將它添加到對(duì)象集合中,然后就可以不用管它了,在游戲引擎之外不需要任何額外的代碼來管理這些對(duì)象。
所有游戲?qū)ο笫窃贑GameObjectBase的繼承類中實(shí)現(xiàn)的,我們馬上就會(huì)對(duì)該類進(jìn)行詳細(xì)介紹。為了保存這些對(duì)象的集合,需要在CGameEngineBase類中添加一個(gè)類變量及其相應(yīng)的訪問屬性。如程序清單4-3所示。
程序清單4-3 游戲引擎中的對(duì)象集合及其訪問屬性
/// <summary>
/// Store a collection of game objects that are currently active
/// </summary>
private System.Collections.Generic.List<CGameObjectBase> _gameObjects;
/// <summary>
/// Retrieves the list of active game objects
/// </summary>
public System.Collections.Generic.List<CGameObjectBase> GameObjects
{
get
{
return _gameObjects;
}
}
然后要對(duì)類的構(gòu)造函數(shù)進(jìn)行修改,當(dāng)類進(jìn)行實(shí)例化時(shí)要?jiǎng)?chuàng)建一個(gè)_gameObjects集合的實(shí)例。
要管理該對(duì)象列表中的對(duì)象,需要添加一些額外的代碼,在下一節(jié)的Advance函數(shù)中將對(duì)其進(jìn)行介紹。
2. 游戲中的方法
為了使游戲能夠運(yùn)行,需要讓它做下列事情:
● 執(zhí)行啟動(dòng)初始化。
● 為開始一個(gè)新游戲進(jìn)行重置。
● 玩游戲時(shí)對(duì)游戲的狀態(tài)進(jìn)行更新。
● 在屏幕上進(jìn)行繪制。
接下來看看每個(gè)工作是如何實(shí)現(xiàn)和使用的。