書(shū)名:《逐夢(mèng)旅程:Windows游戲編程之從零開(kāi)始》
作者博客地址:http://blog.csdn.net/poem_qianmo/article/details/12895487
因?yàn)榻裉煺n比較多,上課時(shí)沒(méi)事就看書(shū)了,所以看了超多??赐炅肆⑵哒掳盐?、六章的代碼實(shí)現(xiàn)了,第七章還差一個(gè)示例沒(méi)有寫(xiě)完。由于感覺(jué)第七章書(shū)里講的思路不是很清晰,還想整理一下,所以明天再更。以下是五、六章的內(nèi)容。
Windows繪圖技巧
1. 加載圖片
我之前一直不明白既然要在ps中處理圖片,為什么不直接設(shè)置成背景透明的png格式的圖片呢?這是因?yàn)樵贕DI只能讀取bmp、cur、ico三種格式的圖片。所以我們中作游戲中的圖片基本上都是位圖,也就是bmp格式的。
另外,為什么要把一個(gè)動(dòng)畫(huà)的各幀和遮罩拼接到一張圖片上面,而不是格子保存為一張圖片呢?這是因?yàn)樾实膯?wèn)題。就像下圖的逍遙哥哥,程序加載一張圖片的效率自然要比加載16張高得多,而效率問(wèn)題在游戲編程中是非常非常重要的。

2. 透明背景
有兩種方法可以實(shí)現(xiàn)透明背景:
(1)使用遮罩 ?先用遮罩和背景做“與運(yùn)算”,在用圖片和背景做“或運(yùn)算”。
(2)透明顏色 ?使用TransparentBlt函數(shù),指定一種顏色為透明
Windows動(dòng)畫(huà)技術(shù)
1. 定時(shí)器動(dòng)畫(huà)顯示
通過(guò)定時(shí)器(SetTimer函數(shù))每隔一段時(shí)間向程序發(fā)送WM_TIMER消息。
注意:定時(shí)器的相應(yīng)不是異步的。就是說(shuō)到達(dá)設(shè)定時(shí)間后,并不會(huì)馬上相應(yīng)。而是將WM_TIMER存入消息隊(duì)列中,和其他消息一樣,等待著被逐條取出處理。
2. 游戲循環(huán)動(dòng)畫(huà)顯示
利用消息循環(huán)過(guò)程,在里面調(diào)用GamePaint函數(shù),是窗口每隔一段時(shí)間重繪,而達(dá)到動(dòng)畫(huà)的效果。
3. 透明背景的動(dòng)畫(huà)
將上述內(nèi)容結(jié)合起來(lái),只要算好圖片及遮罩的坐標(biāo),掌握了規(guī)律,就很簡(jiǎn)單了。
另外,在示例程序中利用了“三緩沖”,也就是三個(gè)DC。首先將位圖選入bufferDC里,再將bufferDC繪制到mDC上,最后將mDC繪制到hDC上。我自己寫(xiě)的程序是“雙緩沖”,也就是直接將位圖選入mrDC里,再繪制到hDC上。在這個(gè)小游戲中,兩者的效果并沒(méi)有什么區(qū)別。但是要繪制的物體很多,“三緩沖”的效果應(yīng)該會(huì)更好一點(diǎn)。
4. 貼圖排序
因?yàn)槲矬w有遠(yuǎn)近關(guān)系,有些地方可能會(huì)遮擋,所以當(dāng)要繪制的物體比價(jià)多時(shí),要先根據(jù)遠(yuǎn)近排序,在按順序繪制。繪制多個(gè)同樣的物體,可以給其創(chuàng)建一個(gè)結(jié)構(gòu)體,便于管理。
考研的大佬們加油哦~
