正文

開(kāi)發(fā)游戲引擎(9)

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


 

4.2.4  CGameEngineGDIBase類

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

● 目的  一個(gè)CGameEngineBase類的實(shí)現(xiàn),提供GDI圖形所需的功能。

● 類型  抽象基類。

● 父類  CgameEngineBase。

● 子類  各個(gè)游戲,創(chuàng)建在獨(dú)立的程序集中。

● 主要功能

● Prepare  為執(zhí)行GDI渲染做好準(zhǔn)備。

● Render  提供有效的圖形渲染技術(shù)。

● Present  將生成好的圖形顯示到屏幕上。

抽象引擎對(duì)象與抽象游戲?qū)ο蠖家呀?jīng)就位了,現(xiàn)在要為GDI繪制引擎添加功能。CGameEngineGDIBase類仍然被聲明為abstract,但實(shí)際的游戲類將從它繼承而來(lái)。

該類附加函數(shù)中最有意義的是Render方法。我們來(lái)看看該方法以及這里實(shí)現(xiàn)方式上的區(qū)別。

1. 渲染

每個(gè)對(duì)象需要對(duì)后臺(tái)緩沖區(qū)進(jìn)行更新時(shí),都會(huì)使用Render函數(shù)。我們要進(jìn)行許多需要的操作:

● 如果后臺(tái)緩沖區(qū)尚未執(zhí)行初始化,則進(jìn)行初始化。

● 清空背景。

● 向后臺(tái)緩沖區(qū)中繪制所有對(duì)象。

● 使游戲窗體失效,觸發(fā)一個(gè)Paint事件,這樣我們就可以將修改了的后臺(tái)緩沖區(qū)復(fù)制到窗體中。

我們首先來(lái)討論后臺(tái)緩沖區(qū),正如上一章中所述,這是一個(gè)不顯示在屏幕上的Bitmap對(duì)象,我們將在其中繪制所有的圖形對(duì)象。它通常維護(hù)的是當(dāng)前要顯示的游戲內(nèi)容的圖形。在Render函數(shù)的開(kāi)始階段,如果對(duì)象尚未可用,就會(huì)調(diào)用InitBackBuffer來(lái)對(duì)緩沖區(qū)進(jìn)行準(zhǔn)備。在本例中,圖形后臺(tái)緩沖區(qū)的大小與游戲窗體的大小一致,如程序清單4-7所示。

程序清單4-7  對(duì)后臺(tái)緩沖區(qū)進(jìn)行初始化

/// <summary>

/// If not already ready, creates and initialises the back buffer that we

/// use for off-screen rendering.

/// </summary>

private void InitBackBuffer()

{

// Make a new back buffer if needed.

if (_backBuffer == null)

{

_backBuffer = new Bitmap(GameForm.ClientSize.Width, GameForm.ClientSize.Height);

// Ensure we repaint the whole form

ForceRepaint();

}

}

下一步,清空背景。這里有兩種可能的方法:將背景改為純色,或者在移動(dòng)的圖形背后顯示一個(gè)背景圖像。

如果沒(méi)有圖像,那么調(diào)用CreateBackgroundImage函數(shù),該函數(shù)為虛函數(shù),繼承游戲類可以對(duì)它進(jìn)行重寫(xiě)。如果需要背景圖片,可以返回一個(gè)包含了背景圖片的Bitmap對(duì)象。然后在繪制圖形之前調(diào)用該函數(shù)來(lái)清空后臺(tái)緩沖區(qū)。

另一方面,如果調(diào)用了該函數(shù)之后還是沒(méi)有背景圖像,那么游戲會(huì)用一個(gè)純色來(lái)清除后臺(tái)緩沖區(qū)。通過(guò)對(duì)象的BackgroundColor屬性來(lái)指定該顏色。

第三步是將所有的對(duì)象都繪制到后臺(tái)緩沖區(qū)中。這里先跳過(guò)這一步驟的細(xì)節(jié),因?yàn)槲覀凂R上要在第4.4節(jié)中對(duì)它進(jìn)行深入的介紹??梢赃@樣說(shuō):所有需要重繪的對(duì)象都會(huì)在后臺(tái)緩沖區(qū)中繪制好。

最后,我們調(diào)用窗體的Invalidate方法來(lái)觸發(fā)重繪事件。就是靠這種機(jī)制,將修改后的后臺(tái)緩沖區(qū)中的內(nèi)容繪制到屏幕上,這樣才能被人們看到。當(dāng)該事件被觸發(fā)時(shí),通過(guò)傳遞窗體的Graphics實(shí)例,在CGameEngineGDIBase.Present方法中會(huì)對(duì)窗體進(jìn)行調(diào)用。我們很快就會(huì)看到窗體是如何與引擎相聯(lián)系的。


上一章目錄下一章

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