現(xiàn)在是時候利用目前所學(xué)到的知識來編寫一個游戲了。在接下來的幾章中,我們將先構(gòu)建一個直觀并且易用的游戲框架,然后再利用這個框架創(chuàng)建自己的作品。該框架會考慮到目前為止我們所發(fā)現(xiàn)的各種問題及設(shè)備的多樣性,將這些細節(jié)問題盡可能地解決,掃除我們的后顧之憂。
在本章中,我們將學(xué)習(xí)圖形設(shè)備接口(Graphics Device Interface,GDI),它是Windows Mobile中的基本圖形技術(shù)之一。
3.1 GDI概述
我們首先要清楚:GDI不是一個高性能圖形接口。我們也不會用它來創(chuàng)建快速移動的3D游戲(3D游戲的詳細情況將在后面講解OpenGL ES時進行介紹)。但在此提到它并非是在浪費時間。因為對于很多游戲和游戲形式而言,GDI足以完美地解決問題,并且非常適合。它的使用很簡單,并且在各種版本的Windows Mobile中都能夠得到支持,幾乎在所有的設(shè)備上都表現(xiàn)出了很好的性能。
長期以來,移動設(shè)備在性能與功能上明顯落后于臺式PC。臺式計算機承擔(dān)了主要的3D變革,即使很便宜的顯卡都具有強大的性能。而移動設(shè)備不論在電源消耗上,還是在設(shè)備尺寸上,都仍然受到局限。像DirectX和OpenGL這樣的API能夠提供一系列強大靈活的功能。很多設(shè)備不能處理這些技術(shù)所需的復(fù)雜操作。相比之下,雖然GDI提供的功能很簡單,但它們在舊硬件和新硬件上都能很好地工作,只需要稍加努力,就可以編寫出既好玩又吸引人的游戲。
GDI是一套能執(zhí)行簡單的圖形操作的類與函數(shù)。Windows Mobile操作系統(tǒng)本身在很多自帶的顯示功能上都使用了GDI。
在下面的章節(jié)中,我們將討論如何使用GDI并介紹它為游戲開發(fā)人員提供了哪些功能。
3.2 開始繪圖
我們的圖形編程將以Form類的Paint事件為起點,每當(dāng)窗體(或窗體的某一部分)需要重繪時就會調(diào)用Paint事件。在該事件中,可以向窗口中繪制我們所需要的任何內(nèi)容,并可以確保只要我們的窗體可見,這些圖像都會持久顯示。
Paint事件的調(diào)用包含兩個參數(shù),如下所示。
private void Form1_Paint(object sender, PaintEventArgs e)
{
}
與所有標(biāo)準(zhǔn)的.NET事件一樣,sender對象提供了對調(diào)用該事件的引用(在本例中該對象為需要繪圖的窗體)。第二個參數(shù)類型為PaintEventArgs,它是我們將圖形顯示到屏幕上的渠道。它包含了一個名為Graphics的屬性(其類名也叫Graphics),通過該對象就可以使用GDI提供的所有繪圖函數(shù)與屬性。
我們首先來看一個簡單的例子,該示例在窗體中繪制了一些線段(參見程序清單3-1)。
程序清單3-1 在窗體中繪制線段
private void Form1_Paint(object sender, PaintEventArgs e)
{
// Create a black pen
using (Pen myPen = new Pen(Color.Black))
{
// Draw a line from the top left (0, 0) to the bottom right
// (Width, Height) of the form
e.Graphics.DrawLine(myPen, 0, 0, this.Width, this.Height);
// Draw a line from the top right (Width, 0) to the bottom left
// (0, Height) of the form
e.Graphics.DrawLine(myPen, this.Width,0, 0, this.Height);
}