正文

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

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


 

8. 添加其他函數(shù)

我們還將在基類中添加一些更加深入的功能集,供引擎或者游戲自身使用。

首先,要添加的是一個(gè)隨機(jī)數(shù)生成器。該生成器只是.NET System.Random類的一個(gè)實(shí)例。通過引擎訪問隨機(jī)數(shù)生成器會(huì)有兩個(gè)優(yōu)點(diǎn):第一,每當(dāng)需要隨機(jī)數(shù)時(shí)就可以調(diào)用它,而不用創(chuàng)建本地實(shí)例,從而使代碼能夠更加簡(jiǎn)單;第二(也是最有用的),我們有機(jī)會(huì)為隨機(jī)數(shù)生成器指定一個(gè)固定的隨機(jī)種子。采用固定的隨機(jī)數(shù)種子,使應(yīng)用程序生成的隨機(jī)數(shù)字每次都是同一個(gè)序列,這樣就可以重復(fù)同一個(gè)游戲場(chǎng)景來進(jìn)行測(cè)試(不考慮與玩家的交互)。

還要添加一些代碼,用來在游戲運(yùn)行期間返回游戲的幀率(使用FramesPerSecond屬性)。它記錄了每一秒中屏幕上的圖形更新次數(shù)。我們將盡量獲得幀率的最高值,因?yàn)閹试礁?,?dòng)畫就會(huì)越平滑。當(dāng)幀率降為很低時(shí),游戲會(huì)看上去很卡,所以對(duì)幀率值進(jìn)行監(jiān)視是很有用的。

最后,還要有另一個(gè)對(duì)象管理函數(shù)RemoveTerminatedObjects。當(dāng)某個(gè)對(duì)象不再被游戲所需要時(shí),我們就為它設(shè)置一個(gè)標(biāo)志,告訴引擎該對(duì)象將要終止了。RemoveTerminatedObjects函數(shù)會(huì)從對(duì)象集合中將所有包含該標(biāo)志的對(duì)象刪除。對(duì)象必須通過這種方式來刪除(而不是馬上從集合中將它們刪除),因?yàn)槲覀冃枰谒鼈儽讳N毀之前進(jìn)行清除;在Advance函數(shù)的最后來執(zhí)行這個(gè)任務(wù)。在本章后文中介紹優(yōu)化圖形渲染時(shí)將解釋為什么需要用這種方式來刪除對(duì)象。

4.2.2  CgameObjectBase類

下面對(duì)CGameObjectBase類進(jìn)行概要的介紹:

● 目的  顯示游戲中的圖形對(duì)象。

● 類型  抽象基類。

● 父類  無(wú)。

● 子類  專門用于游戲的圖形API實(shí)現(xiàn),例如用于GDI引擎。

● 主要功能

● Xpos、Ypos、Zpos、LastXPos、LastYPos、LastZPos  用于定義對(duì)象位置的屬性。

● IsNew, Terminate  用于定義對(duì)象狀態(tài)的屬性。

● Render  允許將對(duì)象繪制到游戲中。

● Update  允許對(duì)象自己進(jìn)行移動(dòng)并產(chǎn)生動(dòng)畫。

有很多對(duì)象都繼承于游戲?qū)ο螅晕覀儊砜纯催@些對(duì)象的基類。

CgameObjectBase類是另一個(gè)抽象基類,我們所有實(shí)際的游戲?qū)ο蠖紝乃^承。在其構(gòu)造函數(shù)中要傳遞一個(gè)對(duì)CGameEngineBase游戲引擎(或者是其子類)的引用。該對(duì)象中存儲(chǔ)了一個(gè)私有的類變量_gameEngine,通過訪問權(quán)限為protected的GameEngine屬性可以訪問它。這樣所有的對(duì)象都可以在其運(yùn)行平臺(tái)中訪問游戲引擎實(shí)例。

1. 對(duì)象的位置

CGameObjectBase類中包含了用于跟蹤對(duì)象位置的一系列屬性值。我們保存每個(gè)對(duì)象當(dāng)前的x坐標(biāo)、y坐標(biāo)和z坐標(biāo)。在第3章中已經(jīng)介紹過x坐標(biāo)和y坐標(biāo);z坐標(biāo)用于表示對(duì)象在第三個(gè)維度上的位置,在屏幕中但不在屏幕上(事實(shí)上z軸應(yīng)與屏幕垂直)。在本書后文中介紹用OpenGL ES開發(fā)3D圖形時(shí),z坐標(biāo)才會(huì)扮演重要的角色。

對(duì)于每一種坐標(biāo),我們都會(huì)將對(duì)象當(dāng)前的位置及先前的位置保存起來。這樣做有兩個(gè)重要的原因。首先,有兩個(gè)位置才能判斷對(duì)象是否移動(dòng)了。本章后文中會(huì)介紹如何使用該信息使游戲引擎在渲染時(shí)更加有效。其次,將兩個(gè)位置都保存的話,能使對(duì)象在這兩個(gè)位置之間移動(dòng)時(shí)更加平滑。在第5章中討論游戲所用的不同的計(jì)時(shí)方式時(shí)將會(huì)用到它。

位置的值使用以下6種屬性表示:Xpos、Ypos、Zpos、LastXPos、LastYPos以及LastZPos。前三個(gè)屬性值將返回對(duì)象的當(dāng)前位置;它們被定義為虛屬性,如果需要,將在繼承對(duì)象類中被重寫。其他三個(gè)屬性用于返回對(duì)象的上一個(gè)位置。

與位置屬性相關(guān)的是UpdatePreviousPosition函數(shù)。它將所有對(duì)象的當(dāng)前位置屬性中的值復(fù)制到先前位置屬性中。每當(dāng)需要更新對(duì)象的位置時(shí),在計(jì)算出對(duì)象的新位置之前,就可以通過游戲引擎來調(diào)用該函數(shù),這樣可以確保對(duì)象的先前位置屬性準(zhǔn)確而及時(shí)。

所有這些與坐標(biāo)相關(guān)的屬性都用float類型來存儲(chǔ)值。這似乎不太必要,畢竟我們不能繪制半個(gè)像素,為何要用分?jǐn)?shù)來標(biāo)志像素的位置呢?

雖然不能在非整數(shù)位置上繪制對(duì)象,但用非整數(shù)來更新其位置還是很有用的。例如,您想在屏幕上以非常慢的速度顯示太陽(yáng)的移動(dòng)軌跡,就會(huì)發(fā)現(xiàn),如果每幀移動(dòng)一個(gè)像素,那么移動(dòng)的速度會(huì)過快。與通過實(shí)現(xiàn)復(fù)雜的邏輯使在若干幀后才移動(dòng)一次相比,現(xiàn)在可以按照0.1或是0.01的增量來移動(dòng)。這樣就將速度降到原來的1/10或1/100,不需要任何額外的代碼。

當(dāng)以后開始使用OpenGL ES時(shí)就能發(fā)現(xiàn)這樣做的另外一個(gè)好處了。OpenGL ES所使用的坐標(biāo)系與屏幕上的像素沒有對(duì)應(yīng)關(guān)系。因此,以分?jǐn)?shù)的方式來修改對(duì)象的位置實(shí)際會(huì)對(duì)其顯示位置產(chǎn)生影響。


上一章目錄下一章

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