tag:C,雙緩存,臟矩形,Win32,API
/* Create by zyzx
* Created 2008-07-02
* Modified 2008-07-03
*/
?????? 翻開學(xué)生時(shí)代的作品,真是百味俱全啊。在追求編程真諦的道路上,迷茫過,痛苦過,也興奮過,至今也持續(xù)這些感覺,可惜不再那么的強(qiáng)烈。
?????? 看了看大二那會(huì)做的東東:貪吃蛇游戲,感覺就像小孩子過家家純粹好玩。雖然編程手法上,就那個(gè)樣,但它確實(shí)令我撥開了編程的面紗。又看了大一那會(huì)也做的個(gè)玩意(用VB做的),終于知道囧字咋寫的了,顯示一個(gè)物體用一個(gè)PictureBox框,結(jié)果屏幕上N多PictureBox框框,程序沒多大,卻卡得不行,呵呵。
?????? 貪吃蛇的基本思路:用一個(gè)循環(huán)鏈表(可增減)記錄蛇,標(biāo)記蛇頭、蛇尾。蛇的移動(dòng),對(duì)于程序內(nèi)部來說,只是蛇頭和蛇尾的標(biāo)記發(fā)生變化。碰撞檢查,也就是檢查蛇頭將前行的一個(gè)位置,是否在蛇本身或出界或不可通過點(diǎn)。用一個(gè)二維數(shù)組標(biāo)記不可通過點(diǎn)。
?????? UI表現(xiàn):準(zhǔn)備一個(gè)畫布(與HDC相兼容的DC或是Image等),首先繪制背景,然后繪制遮擋物體(不可通過點(diǎn)),最后繪制貪吃蛇。完成繪制后將畫布復(fù)制粘貼到屏幕上。這就是雙緩存思想了,可嘆咱剛開始為解決屏幕閃爍問題苦苦思索了幾個(gè)星期。當(dāng)時(shí)咱壓根不知道網(wǎng)上有這多知識(shí)可以查到,寢室聯(lián)個(gè)網(wǎng),除了上門戶網(wǎng)站就是打游戲了,呵呵。
?????? 這里如果要再提高幀速率,還可以使用“臟矩形”,原理即:由于畫面后一張與前面一張只有某些部分變化,因此只需要更新這些部分即可。典型的如Window的窗口系統(tǒng)就是使用的“臟矩形”技術(shù)局部更新。
?????? 用戶操作:玩家使用上下左右箭頭控制,這里使用的是定時(shí)器控制幀率。比如每隔N毫秒檢查一次方向鍵盤的狀態(tài),確定移動(dòng)方向,判斷能否移動(dòng)。。。
?????? 此處由于做的東西比較小,耗時(shí)不是很多,所以沒有碰到幀率過快或過慢而影響控制的問題。實(shí)際的大型游戲中,這里可是比較關(guān)鍵的部分啊,搞得不好就像曾經(jīng)“傳奇”的加速外掛那樣,一秒種內(nèi)砍幾千下,呵呵。。
??????? 整個(gè)程序文件如下:一個(gè)頭文件和一個(gè)實(shí)現(xiàn)文件。
??????? 程序是基于Win32的API編程的,所以使用了Window的編程模板。按鈕繪圖動(dòng)畫等等都是直接使用Win32的API實(shí)現(xiàn)。
tanchishe.h
tanchishe.cpp
如下是第6關(guān)的效果(尺寸沒調(diào)好)