3.2.1 使窗體失效
程序清單3-1依賴的是窗體可以自動(dòng)對其自身進(jìn)行繪制,繪制發(fā)生在窗體第一次被打開時(shí),所以如果利用Paint事件在窗體中進(jìn)行繪制,那么繪制的圖形就會(huì)被顯示出來。
然而,在一些重要的例子中,需要對窗體一遍又一遍地重繪以使顯示在屏幕上的圖形運(yùn)動(dòng)起來。為了強(qiáng)制窗體進(jìn)行重繪,需要調(diào)用其Invalidate方法。該方法通知GDI當(dāng)前所有的窗體內(nèi)容都過期了。所以窗體的Paint事件會(huì)再一次被觸發(fā)以更新窗體。舉個(gè)簡單的例子:在一個(gè)Timer控件中,可以調(diào)用該方法來更新屏幕上顯示的圖形。
Invalidate方法還有一個(gè)重載,可以只對指定的窗體區(qū)域進(jìn)行重繪,這需要在參數(shù)中傳遞一個(gè)Rectangle。我們可以利用該重載只對窗體中實(shí)際發(fā)生變化的部分進(jìn)行重繪來提高游戲的性能。在第4章中我們將利用它來對顯示更新進(jìn)行優(yōu)化。
3.2.2 繪圖坐標(biāo)系
窗體中的位置是使用標(biāo)準(zhǔn)的x軸(水平軸)和y軸(垂直軸)坐標(biāo)系來確定的。GDI中的函數(shù)將使用命名為x和y的參數(shù)來獲取窗體中要被繪圖操作更新的點(diǎn)的位置。
當(dāng)記錄坐標(biāo)時(shí),要將坐標(biāo)中的兩個(gè)值放在括號中,中間以逗號分隔。第一個(gè)值是x坐標(biāo),第二個(gè)值是y坐標(biāo)。例如,(20,50)表示x坐標(biāo)為20,y坐標(biāo)為50的一個(gè)點(diǎn)。
GDI使用的坐標(biāo)系以窗體的左上角(0,0)作為原點(diǎn),然后坐標(biāo)軸沿著窗體的寬與高進(jìn)行延伸,所以窗體右下角的坐標(biāo)為(Form.Width–1, Form.Height–1)。
不管窗體的AutoScaleMode屬性是如何設(shè)置的,所有的坐標(biāo)都以像素為單位。如果您的游戲運(yùn)行時(shí)的分辨率與其設(shè)計(jì)時(shí)的分辨率不同,就需要對圖形進(jìn)行縮放來適應(yīng)新的顯示設(shè)備。我們現(xiàn)在不必?fù)?dān)心這點(diǎn),在第8章實(shí)現(xiàn)一個(gè)完整的游戲時(shí),將介紹如何對這種情況進(jìn)行處理。
3.2.3 顏色
不論繪制什么,我們都需要提供一個(gè)繪圖顏色,可以通過兩種方法來指定要使用的顏色:
● 使用一個(gè)System.Drawing.Color中已命名的顏色值。
● 分別指定組成色彩的紅色、綠色、藍(lán)色的值。
有很多已經(jīng)命名好的顏色值,從諸如Black和Blue這樣的標(biāo)準(zhǔn)顏色名稱到諸如PapayaWhip和BlanchedAlmond這樣的專業(yè)顏色名稱。顏色名稱列表實(shí)際上就是完整的X11顏色列表,該表還形成了HTML及CSS(層疊樣式表)所用的預(yù)定義顏色名稱列表。您可以通過位于http://en.wikipedia.org/wiki/Web_colors上的Wikipedia頁面來獲取關(guān)于這些顏色的更詳細(xì)信息,該頁面中包含了一個(gè)完整的列表,并提供了每種顏色的示例。
顏色也可以通過紅、綠、藍(lán)(加法三原色)亮度值進(jìn)行表示,根據(jù)這三個(gè)值可以形成指定的顏色。這三色中的每一項(xiàng)都是獨(dú)立的,亮度從0(無亮度)~255(最高亮度)變化。例如,指定紅為255,綠與藍(lán)為0時(shí),結(jié)果為純紅。通過改變?nèi)忻總€(gè)顏色的亮度,就可以創(chuàng)建設(shè)備所支持顏色的各種色度。