天天看點

遊戲程式設計之路 -- 《Windows遊戲程式設計大師技巧》第2,3,4章 筆記

    從第二章開始,實在覺得又是在看以前的内容,也許這幾章是為了那些以前從來沒有接觸過win32程式設計的人寫的,但無論如何,還是要看一遍,于是就這周就把第2,3,4章都浏覽了一遍,雖然感覺是以前都看過,但總的來說還是有收獲。

    對于熟悉的章節,我加快了閱讀速度,盡管也許有些内容還是了解不透徹,但為了加快步伐,也就省略了一些問題,目的是為了迅速的進入書本的第二部分。

    首先是WM_PAINT消息,以前一直沒有了解透徹,這次仔細琢磨了一下,并結合了GetDC函數的了解,感覺算是真的了解了。WM_PAINT的一般響應方式是使用   hdc = BeginPaint(hwnd,&ps)    和   EndPaint(hwnd,&ps)  來包圍處理代碼,而且這兩個函數也就隻能在響應WM_PAINT消息中使用,但他們還做了一件事,就是在BeginPaint(hwnd,&ps)會使無效區變成有效,使Windows不再發送WM_PAINT 消息;而    GetDC(hwnd)   和   ReleaseDC(hwnd, hdc)   則是在任何情況下都能使用,卻不會使視窗無效區變的有效,如果你在WM_PAINT消息響應裡面單單的使用這兩個替換掉BeginPaint和EndPaint,就會造成WM_PAINT消息的無限發送,是以,為了解決這個問題,就應該在之後調用GetClientRect(hwnd,&rect);ValidateRect(&rect)來是視窗有效化,這樣就可以避免無限發送WM_PAINT消息了。

    關于無效矩形

    一直以為要是視窗無效,一定要調用InvalidateRect,而且需要自己去記錄和處理無效矩形,然而InvalidateRect隻是提供給程式員一種能夠使一個矩形區域無效化的手段,并不是一定的調用,因為當視窗的某些區域被覆寫或者發生重繪時,WM_PAINT消息被發出,windows都會去記錄無效矩形,并且在存儲在PAINTSTRUCT這個資料結構裡面,通過這個無效矩形,可以在你的消息處理過程中隻去重繪無效的矩形,而提高繪圖效率。而通過BeginPaint獲得的hdc,也隻能去繪制無效區域。

    SendMessage和PostMessage

    以前也想過,這兩個所謂的同步和異步到底是如何實作的,其實這...非常簡單,就是PostMessage是在消息隊列中增加一個消息,而SendMessage就是簡單的調用你的消息處理函數,進而隻有在消息處理函數執行完畢以後,SendMessage才會放回,當然,這就理所當然做到了同步了。

    Making a Real-Time Event Loop

    達到這個目的,就是在更改一般的windows的無限循環模式,不是在等待消息的到來才做動作,而是使循環至始至終都在執行。是以就直接寫一個while(1)循環,而擷取消息這是使用PeekMessage而不是用GetMessage,并加上結束循環的操作

    if(msg.message == WM_QUIT)

    break;

    WM_CHAR 和 WM_KEYDOWN

    簡單的說,WM_KEYDOWNz是檢測你是否按下了鍵盤上的某個鍵,而WM_CHAR則會附帶ASCII碼的資訊。至于資訊,都在wparam和lparam中。

    以上說的,其實都隻是和win32程式設計相關,但和遊戲程式設計也許都沒有太大的關系,這是作者在書中好幾次都提到了的,好了,第四章即将完成,然後就是書本的第二部分。

繼續閱讀