2. 推進游戲
我們還要對Advance方法進行重寫。在該方法中,要檢測游戲中的每個對象來查看其位置是否發(fā)生了移動或是發(fā)生了其他狀況,從而需要對對象進行重繪。其原因也將在第4.4節(jié)中進行介紹。
4.2.5 CGameFunctions類
下面對CGameFunctions類進行介紹:
● 目的 為游戲引擎項目提供實用函數(shù)。
● 類型 包含了靜態(tài)成員的內部類。
● 父類 沒有父類。
● 子類 沒有繼承的子類。
● 主要功能
● IsSmartphone 標識設備是觸摸屏設備還是smart phone設備。
● CombineRectangles 幫助我們操縱矩形區(qū)域。
游戲引擎所包含的最后一個類是CGameFunctions,它為引擎提供了不同的工具函數(shù)。該類為內部類,所以在引擎程序集之外看不到它。該類的構造函數(shù)為私有的,所以無法創(chuàng)建其實例:該類中所有的函數(shù)都是statics的,所以不需要創(chuàng)建對象實例就可以調用它。
我們將在該類中構建一些額外的功能,以在后面章節(jié)中增強引擎。但是現(xiàn)在只實現(xiàn)兩個函數(shù):
● IsSmartphone 就像第2章中所介紹的那樣,該函數(shù)用于判斷設備是一個觸摸屏設備還是一個smart phone設備。
● CombineRectangles 此函數(shù)以兩個Rectangle對象作為參數(shù),并返回一個恰好能容納下這兩個矩形的Rectangle。它實際上是對Rectangle.Union方法進行了包裝,但它將空矩形(將Top、Left、Width及Height全部設置為0)作為特例,并將其排除在外。
這樣,游戲引擎的雛形就完成了——還好,這不太費力。接下來,我們將簡單地將引擎應用到一個游戲中。
4.3 使用游戲引擎
我們在一個單獨的項目中來構建游戲,通過對游戲引擎項目或對其DLL進行引用來訪問游戲引擎類。
游戲項目中將包含一個game類,它繼承于CGameEngineGDIBase類,我們將控制游戲本身整體流程的代碼放到該類中。
我們還將添加一些Object類,用于代表游戲中的對象(分別是星球、導彈、外星人等)。game類可以將這些類的實例添加到游戲中。
最后要在一個.NET CF窗體中實現(xiàn)游戲,在該窗體中需要一點代碼,其中大部分是相似的,并且很簡單:
● 在窗體的構造函數(shù)中,對已經定義在游戲項目中的game類進行實例化,將窗體本身作為一個參數(shù)進行引用。
● 對OnPaintBackgroud方法進行重寫,正如前面所討論的。
● 為Paint事件添加處理程序,在其中調用game類的Present方法,用于將后臺緩沖區(qū)顯示在屏幕上。
● 創(chuàng)建一個游戲循環(huán),來重復更新游戲。在循環(huán)中將調用game類的Advance函數(shù)。
稍后我們將對該循環(huán)進行詳解。
目前來看,外部程序調用引擎本身看起來還是非常簡單的!
創(chuàng)建彈球示例游戲
接下來,我們用游戲引擎來構建一個示例項目。我們將創(chuàng)建一個小球,小球能在游戲的窗口中到處反彈。與上一章中創(chuàng)建的移動方塊比較相像,但這里將模擬重力,所以小球在降落到窗口的底部的過程中會加速。
Bounce項目是一個單獨的程序集,項目中添加了對GameEngineCh4的引用(本章中所構建的游戲引擎版本)。在提供的項目中已經添加了該引用。也可以在Solution Explorer窗口中,右擊游戲項目中的References節(jié)點,然后選擇Add Reference選項(在VB.NET中,雙擊My Project節(jié)點,選擇References選項卡,然后單擊Add按鈕)自行添加引用。如果游戲引擎項目包含在同一個解決方案中,那么單擊Projects選項卡在其中選擇游戲引擎項目;否則,就在Browse選項卡中定位編譯后的DLL。這樣就可以在游戲項目中使用該游戲引擎了。
Bounce項目包含了一個用于顯示游戲輸出的窗體,以及兩個用于運行游戲的類(一個從GameEngineCh4.CGameEngineGDIBase繼承,另一個從CGameObjectGDIBase繼承)。在本書配套下載代碼的4_1_Bounce目錄中可以找到該項目。
1. CbounceGame類
首先要創(chuàng)建游戲引擎。這將在CbounceGame類中實現(xiàn),該類從游戲引擎的CgameEngine-
GDIBase類中繼承。除了其構造函數(shù)之外,它只有兩個函數(shù),即Prepare函數(shù)和Reset函數(shù)的重寫。程序清單4-8展示了Prepare函數(shù)中的代碼。
程序清單4-8 Bounce 游戲的Prepare函數(shù)
/// <summary>
/// Prepare the game
/// </summary>
public override void Prepare()
{
Assembly asm;
// Allow the base class to do its work
base.Prepare();
// Initialise graphics library
if (GameGraphics.Count == 0)
{
asm = Assembly.GetExecutingAssembly();
GameGraphics.Add("Ball",
new Bitmap(asm.GetManifestResourceStream("Bounce.Graphics.Ball. png")));
}
}