正文

GDI圖形編程(17)

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


 

程序清單3-16  利用雙緩沖在屏幕上繪制彈跳的顏色塊

/// <summary>

/// Draw all of the graphics for our scene

/// </summary>

private void DrawScene(Graphics gfx)

{

// Have we initialised our back buffer yet?

if (backBuffer == null)

{

// We haven't, so initialise it now.

backBuffer = new Bitmap(this.Width, this.Height);

}

// Create a graphics object for the backbuffer

using (Graphics buffergfx = Graphics.FromImage(backBuffer))

{

// Clear the back buffer

buffergfx.Clear(Color.White);

// Draw our box into the back buffer at its current location

using (Brush b = new SolidBrush(Color.Blue))

{

buffergfx.FillRectangle(b, xpos, ypos, boxSize, boxSize);

}

}

// Finally, copy the content of the entire backbuffer to the window

gfx.DrawImage(backBuffer, 0, 0);

}

private void Method2_DoubleBuffering_Paint(object sender, PaintEventArgs e)

{

// Call DrawScene to do the drawing for us

DrawScene(e.Graphics);

}

再次運(yùn)行這個(gè)示例,這次選擇DoubleBuffer生成方式。在運(yùn)行結(jié)果中請注意下面兩點(diǎn):

● 顏色塊的移動(dòng)速度比上一個(gè)示例要慢;

● 動(dòng)畫仍然很閃爍——實(shí)際上,甚至比前面的示例還要嚴(yán)重。

顏色塊的移動(dòng)速度比使用第一種方法時(shí)慢,因?yàn)橐龈嗟墓ぷ鳎翰恢皇呛唵蔚乩L制顏色塊,現(xiàn)在還要清空整個(gè)后臺(tái)緩沖區(qū),并且將后臺(tái)緩沖區(qū)中的內(nèi)容復(fù)制到屏幕上。這些需要一些時(shí)間來完成。將這個(gè)開銷最小化是另一類優(yōu)化,我們將在第4章中進(jìn)行討論。在第5章中,我們還將討論在不同的運(yùn)行環(huán)境下如何使速度保持一致。

發(fā)生閃爍的原因是盡管在后臺(tái)緩沖區(qū)中創(chuàng)建了所有的圖形,但在每次重繪時(shí),GDI仍然會(huì)自動(dòng)對窗體進(jìn)行清空。我們需要合適地處理這種閃爍才可以在任何窗體中都顯示平滑的動(dòng)畫。

可以很容易地關(guān)閉窗體的自動(dòng)清除功能。我們可以對Form類的OnPaintBackground方法進(jìn)行重寫,在其中不調(diào)用基類中的方法(清除操作實(shí)際上就是發(fā)生在這里),并且也不進(jìn)行任何其他操作。這樣在OnPaintBackground事件的處理過程中,Paint事件發(fā)生之前屏幕上顯示的所有內(nèi)容都會(huì)保留下來。

將后臺(tái)繪制關(guān)閉后,現(xiàn)在將后臺(tái)緩沖區(qū)內(nèi)容復(fù)制到窗體中時(shí)不會(huì)發(fā)生任何閃爍。后臺(tái)緩沖區(qū)直接替換了先前顯示的圖像,不受中間繪圖的影響。在示例應(yīng)用程序中選擇SmoothDraw生成方式來查看其運(yùn)行情況。最終我們實(shí)現(xiàn)了顏色塊的平滑的、無閃爍的運(yùn)動(dòng)。

我們在使用GDI創(chuàng)建游戲時(shí)就將采用這種方法。后臺(tái)緩沖區(qū)中包含了整個(gè)屏幕的全部圖像,在游戲中當(dāng)任何物體發(fā)生移動(dòng)時(shí),就將后臺(tái)緩沖區(qū)復(fù)制到窗體中。


上一章目錄下一章

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