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