正文

開發(fā)游戲引擎(10)

Windows移動(dòng)游戲開發(fā)實(shí)戰(zhàn) 作者:(美)Adam Dawes


 

2. 推進(jìn)游戲

我們還要對Advance方法進(jìn)行重寫。在該方法中,要檢測游戲中的每個(gè)對象來查看其位置是否發(fā)生了移動(dòng)或是發(fā)生了其他狀況,從而需要對對象進(jìn)行重繪。其原因也將在第4.4節(jié)中進(jìn)行介紹。

4.2.5  CGameFunctions類

下面對CGameFunctions類進(jìn)行介紹:

● 目的  為游戲引擎項(xiàng)目提供實(shí)用函數(shù)。

● 類型  包含了靜態(tài)成員的內(nèi)部類。

● 父類  沒有父類。

● 子類  沒有繼承的子類。

● 主要功能

● IsSmartphone  標(biāo)識設(shè)備是觸摸屏設(shè)備還是smart phone設(shè)備。

● CombineRectangles  幫助我們操縱矩形區(qū)域。

游戲引擎所包含的最后一個(gè)類是CGameFunctions,它為引擎提供了不同的工具函數(shù)。該類為內(nèi)部類,所以在引擎程序集之外看不到它。該類的構(gòu)造函數(shù)為私有的,所以無法創(chuàng)建其實(shí)例:該類中所有的函數(shù)都是statics的,所以不需要?jiǎng)?chuàng)建對象實(shí)例就可以調(diào)用它。

我們將在該類中構(gòu)建一些額外的功能,以在后面章節(jié)中增強(qiáng)引擎。但是現(xiàn)在只實(shí)現(xiàn)兩個(gè)函數(shù):

● IsSmartphone  就像第2章中所介紹的那樣,該函數(shù)用于判斷設(shè)備是一個(gè)觸摸屏設(shè)備還是一個(gè)smart phone設(shè)備。

● CombineRectangles  此函數(shù)以兩個(gè)Rectangle對象作為參數(shù),并返回一個(gè)恰好能容納下這兩個(gè)矩形的Rectangle。它實(shí)際上是對Rectangle.Union方法進(jìn)行了包裝,但它將空矩形(將Top、Left、Width及Height全部設(shè)置為0)作為特例,并將其排除在外。

這樣,游戲引擎的雛形就完成了——還好,這不太費(fèi)力。接下來,我們將簡單地將引擎應(yīng)用到一個(gè)游戲中。

4.3  使用游戲引擎

我們在一個(gè)單獨(dú)的項(xiàng)目中來構(gòu)建游戲,通過對游戲引擎項(xiàng)目或?qū)ζ銬LL進(jìn)行引用來訪問游戲引擎類。

游戲項(xiàng)目中將包含一個(gè)game類,它繼承于CGameEngineGDIBase類,我們將控制游戲本身整體流程的代碼放到該類中。

我們還將添加一些Object類,用于代表游戲中的對象(分別是星球、導(dǎo)彈、外星人等)。game類可以將這些類的實(shí)例添加到游戲中。

最后要在一個(gè).NET CF窗體中實(shí)現(xiàn)游戲,在該窗體中需要一點(diǎn)代碼,其中大部分是相似的,并且很簡單:

● 在窗體的構(gòu)造函數(shù)中,對已經(jīng)定義在游戲項(xiàng)目中的game類進(jìn)行實(shí)例化,將窗體本身作為一個(gè)參數(shù)進(jìn)行引用。

● 對OnPaintBackgroud方法進(jìn)行重寫,正如前面所討論的。

● 為Paint事件添加處理程序,在其中調(diào)用game類的Present方法,用于將后臺緩沖區(qū)顯示在屏幕上。

● 創(chuàng)建一個(gè)游戲循環(huán),來重復(fù)更新游戲。在循環(huán)中將調(diào)用game類的Advance函數(shù)。

稍后我們將對該循環(huán)進(jìn)行詳解。

目前來看,外部程序調(diào)用引擎本身看起來還是非常簡單的!

創(chuàng)建彈球示例游戲

接下來,我們用游戲引擎來構(gòu)建一個(gè)示例項(xiàng)目。我們將創(chuàng)建一個(gè)小球,小球能在游戲的窗口中到處反彈。與上一章中創(chuàng)建的移動(dòng)方塊比較相像,但這里將模擬重力,所以小球在降落到窗口的底部的過程中會(huì)加速。

Bounce項(xiàng)目是一個(gè)單獨(dú)的程序集,項(xiàng)目中添加了對GameEngineCh4的引用(本章中所構(gòu)建的游戲引擎版本)。在提供的項(xiàng)目中已經(jīng)添加了該引用。也可以在Solution Explorer窗口中,右擊游戲項(xiàng)目中的References節(jié)點(diǎn),然后選擇Add Reference選項(xiàng)(在VB.NET中,雙擊My Project節(jié)點(diǎn),選擇References選項(xiàng)卡,然后單擊Add按鈕)自行添加引用。如果游戲引擎項(xiàng)目包含在同一個(gè)解決方案中,那么單擊Projects選項(xiàng)卡在其中選擇游戲引擎項(xiàng)目;否則,就在Browse選項(xiàng)卡中定位編譯后的DLL。這樣就可以在游戲項(xiàng)目中使用該游戲引擎了。

Bounce項(xiàng)目包含了一個(gè)用于顯示游戲輸出的窗體,以及兩個(gè)用于運(yùn)行游戲的類(一個(gè)從GameEngineCh4.CGameEngineGDIBase繼承,另一個(gè)從CGameObjectGDIBase繼承)。在本書配套下載代碼的4_1_Bounce目錄中可以找到該項(xiàng)目。

1. CbounceGame類

首先要?jiǎng)?chuàng)建游戲引擎。這將在CbounceGame類中實(shí)現(xiàn),該類從游戲引擎的CgameEngine-

GDIBase類中繼承。除了其構(gòu)造函數(shù)之外,它只有兩個(gè)函數(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")));

}

}


上一章目錄下一章

Copyright ? 讀書網(wǎng) m.ranfinancial.com 2005-2020, All Rights Reserved.
鄂ICP備15019699號 鄂公網(wǎng)安備 42010302001612號