正文

GDI圖形編程(17)

Windows移動游戲開發(fā)實戰(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);

}

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

● 顏色塊的移動速度比上一個示例要慢;

● 動畫仍然很閃爍——實際上,甚至比前面的示例還要嚴重。

顏色塊的移動速度比使用第一種方法時慢,因為要做更多的工作:不只是簡單地繪制顏色塊,現(xiàn)在還要清空整個后臺緩沖區(qū),并且將后臺緩沖區(qū)中的內(nèi)容復制到屏幕上。這些需要一些時間來完成。將這個開銷最小化是另一類優(yōu)化,我們將在第4章中進行討論。在第5章中,我們還將討論在不同的運行環(huán)境下如何使速度保持一致。

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

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

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

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


上一章目錄下一章

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