GDI繪圖及動(dòng)畫(huà) | 《Windows游戲編程》讀書(shū)筆記(三)

書(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)題在游戲編程中是非常非常重要的。


逍遙哥哥向上走的動(dòng)畫(huà)幀

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)體,便于管理。


考研的大佬們加油哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容