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ù)的開始階段,如果對(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è)背景圖像。
如果沒有圖像,那么調(diào)用CreateBackgroundImage函數(shù),該函數(shù)為虛函數(shù),繼承游戲類可以對(duì)它進(jìn)行重寫。如果需要背景圖片,可以返回一個(gè)包含了背景圖片的Bitmap對(duì)象。然后在繪制圖形之前調(diào)用該函數(shù)來(lái)清空后臺(tái)緩沖區(qū)。
另一方面,如果調(diào)用了該函數(shù)之后還是沒有背景圖像,那么游戲會(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)系的。