射击的乐趣:WIN32诠释打飞机游戏
一樓留給鏈接http://blog.csdn.net/crocodile__/article/details/11860129
樓上神貼,膜拜片刻......
一、游戲玩法和已經(jīng)實(shí)現(xiàn)的功能
1.打開游戲會(huì)有提示是否開始游戲。
2.鍵盤↑↓←→控制保衛(wèi)者飛機(jī)(米格21原型,米格粉們千萬不要看這架飛機(jī))上下左右移動(dòng),躲避敵機(jī)并利用機(jī)槍掃射敵機(jī)。
3.擊落大飛機(jī)獲得100分,中型飛機(jī)獎(jiǎng)勵(lì)60分,小飛機(jī)獎(jiǎng)勵(lì)20分,左上角分?jǐn)?shù)板顯示游戲積分。
4.全局快捷鍵SHIFT+A重新開始游戲,CTRL+A強(qiáng)行退出游戲,空格鍵暫停以及繼續(xù)游戲,也可以鼠標(biāo)點(diǎn)擊左上角的圖標(biāo)來切換暫停與繼續(xù)模式。
5.保衛(wèi)者的硬度比不上野蠻的敵機(jī),發(fā)生碰撞時(shí)會(huì)被摧毀掉,注意,保衛(wèi)者有兩次重生機(jī)會(huì)。
6.敵機(jī)突破保衛(wèi)者的防守陣地則宣告游戲結(jié)束。
7.等級(jí)增強(qiáng)功能,當(dāng)擊殺積分達(dá)到一定數(shù)值,敵機(jī)會(huì)更加瘋狂的進(jìn)攻,相應(yīng)的,保衛(wèi)者的節(jié)奏也會(huì)加快。
8.不要覺得素材太雷同,有興趣的朋友可以更換素材,游戲支持按照素材的大小進(jìn)行自動(dòng)調(diào)整。選取背景以外圖片請(qǐng)以白色作為背景色,圖片大小自行調(diào)節(jié),window7的畫圖功能就支持縮放比例功能。
二、技術(shù)積累
版本開發(fā)間歇期抽時(shí)間完成的,寫作的過程比較零碎,基本是遇到不會(huì)的API就上百度文庫、博客園、VC驛站來查使用方法或者案例,一邊學(xué)習(xí)一邊完善對(duì)win32模型的理解。
打個(gè)廣告哈:誠(chéng)邀widnows編程的兄弟姐妹們一起分享學(xué)習(xí),要是有大牛愿意指點(diǎn)一下就更好了,在下郵箱believing_dan@hotmail.com ?QQ:382128698
雙緩沖技術(shù)實(shí)現(xiàn)平滑刷新畫面,避免頻繁paint造成的閃爍。
雙緩沖技術(shù)用到的透明背景貼圖,透明背景貼字。
構(gòu)建自己的消息處理流程和注冊(cè)全局快捷鍵,在Pretranslatemessage中攔截虛擬鍵盤消息并進(jìn)行預(yù)處理,之前的一篇隨筆WIN32消息機(jī)制有詳細(xì)介紹。
從指定路徑加載位圖。
碰撞檢測(cè),目前實(shí)現(xiàn)比較粗糙,簡(jiǎn)化為矩形包圍體進(jìn)行碰撞檢測(cè)。
客戶區(qū)鼠標(biāo)事件處理,當(dāng)點(diǎn)擊指定區(qū)域時(shí)才觸發(fā)指定事件,對(duì)鼠標(biāo)點(diǎn)擊區(qū)域進(jìn)行判斷。
游戲狀態(tài)標(biāo)志加上定時(shí)器實(shí)現(xiàn)游戲暫停與游戲中狀態(tài)切換,注冊(cè)了兩個(gè)定時(shí)器分別對(duì)應(yīng)保衛(wèi)者射擊與敵機(jī)移動(dòng)。
AfxMessageBox的運(yùn)用,加入選擇以及風(fēng)格的提示消息。
三、捉蟲子
1.為了讓爆炸有一個(gè)平滑的顯示效果,給飛機(jī)設(shè)計(jì)了NORMAL、BOOST、DESTROYED三個(gè)狀態(tài),BOOST狀態(tài)判斷是否貼了最后一張爆炸圖,用了當(dāng)前pos是否等于圖片邊緣的判斷,沒有考慮到int a = 10/3; int b = a*3; ?b 其實(shí)不等于a的這種場(chǎng)景,導(dǎo)致飛機(jī)下落過程中看起來消失掉,真實(shí)狀態(tài)卻一直保持在BOOST。
2.同樣是爆炸效果,保衛(wèi)者未做移動(dòng)頻率限制,而敵機(jī)采用定時(shí)器控制移動(dòng),可能存在敵機(jī)已經(jīng)為DESTROYED狀態(tài)且尚未調(diào)用定時(shí)器清除掉數(shù)據(jù)時(shí)碰撞到保衛(wèi)者的場(chǎng)景,保衛(wèi)者移動(dòng)碰撞檢測(cè)剔除該場(chǎng)景。
四、感悟
? 對(duì)著書本苦讀只能出秀才,勤于實(shí)踐才能那啥,額,成大牛吧。計(jì)算機(jī)不只是編程,更是一種解決問題的方法,按下F5只代表設(shè)計(jì)與思考的告一段落,最重要的是這之前的準(zhǔn)備。
學(xué)會(huì)計(jì)算機(jī)科學(xué)非常困難但絕對(duì)必要。
?五、關(guān)鍵代碼
成功加載一張位圖并在對(duì)話框中顯示是第一步。
View Code有了上面的基礎(chǔ)就可以去理解一下雙緩沖,雙緩沖繪圖的簡(jiǎn)單流程就是:創(chuàng)建一個(gè)緩沖圖層buffbmp,創(chuàng)建兩個(gè)畫圖對(duì)象bufferdc和bmpdc,bufferdc關(guān)聯(lián)緩沖圖層,bmpdc依次關(guān)聯(lián)想要繪制的bmp信息并將之貼到緩沖圖層,緩沖圖層所有畫面都繪制完畢才會(huì)貼到真正的設(shè)備上下文,優(yōu)點(diǎn)在于最終呈現(xiàn)到設(shè)備的畫面是一次成型的,相比逐次貼圖到主畫面的方式可以消滅掉閃爍現(xiàn)象。
具體的流程如下:
1.創(chuàng)建一個(gè)設(shè)備兼容位圖CreateCompatibleBitmap作為緩沖層,初學(xué)者理解為創(chuàng)建一張畫布;
2.創(chuàng)建一個(gè)用于關(guān)聯(lián)畫布的設(shè)備兼容的內(nèi)存設(shè)備上下文環(huán)境CreateCompatibleDC,初學(xué)者理解成創(chuàng)建一個(gè)GDI的類對(duì)象,通過該對(duì)象可以調(diào)用GDI的各種繪圖函數(shù),該對(duì)象由windows保證與指定設(shè)備兼容,在關(guān)聯(lián)的設(shè)備上都能運(yùn)作良好;
3.GDI對(duì)象選擇畫布SelectObject,SelectObject是個(gè)重載函數(shù),根據(jù)參數(shù)的不同產(chǎn)生不同的效果,選擇畫布以后繪圖就在該畫布上畫畫,選擇畫筆,以后繪圖就使用指定的畫筆。
4.重復(fù)步驟2創(chuàng)建一個(gè)用于關(guān)聯(lián)內(nèi)存位圖(加載到內(nèi)存中的素材)的設(shè)備兼容的內(nèi)存設(shè)備上下文環(huán)境,這個(gè)名字真的很長(zhǎng)。
5.步驟4創(chuàng)建的DC關(guān)聯(lián)內(nèi)存位圖(以后稱為bmpdc,緩沖畫布關(guān)聯(lián)DC簡(jiǎn)稱為bufferdc)選擇素材bmp并調(diào)用貼圖函數(shù)TransparentTlt將素材貼到畫布上。
? ? 6.重復(fù)步驟5,直到所有素材都被貼到畫布上。
? ? 7.將畫布上的像素位塊轉(zhuǎn)移到設(shè)備上BitBlt。
? ? ??View Code
敵機(jī)移動(dòng)采用定時(shí)器驅(qū)動(dòng),定時(shí)器的調(diào)用模式比較明了:設(shè)置定時(shí)器、取消定時(shí)器、定時(shí)器處理。
SetTimer設(shè)置定時(shí)器,KillTimer取消定時(shí)器,?在消息處理中對(duì)定時(shí)器關(guān)聯(lián)事件進(jìn)行處理
View Code
? ? View Code
? ??View Code
? ? 做了兩個(gè)定時(shí)器來針對(duì)不同的需求:1.敵機(jī)向保衛(wèi)者基地沖鋒和子彈移動(dòng),要求移動(dòng)幅度小且具有連貫性;2.保衛(wèi)者的武器自動(dòng)攻擊,這個(gè)時(shí)間間隔比較長(zhǎng),要不滿屏子彈,小時(shí)候特想有的大招,隨便揮揮手,神兵自天而降,干掉所有的怪物,額,我這思考能力又把主題扯遠(yuǎn)了。
保衛(wèi)者的子彈打中敵機(jī)和保衛(wèi)者遭遇敵機(jī)都需要產(chǎn)生對(duì)應(yīng)的特效,摧毀敵機(jī)和保衛(wèi)者被干掉,這就需要碰撞檢測(cè),當(dāng)然,小游戲要求的精度不高,可以簡(jiǎn)單的以矩形包圍體進(jìn)行近似化檢測(cè),矩形包圍體發(fā)生碰撞就斷定發(fā)生了碰撞事件,從而觸發(fā)相應(yīng)的處理。
View Code
? ??View Code
? ? ?好吧,代碼中已經(jīng)暴露了下一階段的內(nèi)容,就是積分和等級(jí)體系,這沒啥好講的。
捎帶展示一下無意中添加的一個(gè)特性吧,窗口可以隨著背景素材的大小進(jìn)行自動(dòng)擴(kuò)展,游戲元素比如敵機(jī)、保衛(wèi)者、子彈等都可以隨時(shí)替換并根據(jù)替換的素材大小自行調(diào)節(jié),會(huì)自動(dòng)適應(yīng)窗口大小,限制也是有的,就是飛機(jī)爆炸圖片的段數(shù)是固定的,小飛機(jī)有兩個(gè)階段,中飛機(jī)有三個(gè)階段,大飛機(jī)有四個(gè)階段,游戲元素支持隨意替換是因?yàn)樵O(shè)計(jì)時(shí)候采用的素材大小而非固定值的方式,窗口大小隨著背景調(diào)整大小貼一段代碼,稍等,大家可能還比較好奇,這個(gè)對(duì)話框是怎么整的,咋沒有系統(tǒng)繪制的非客戶區(qū)呢?一并告訴你。
View Code
? ? 這兩個(gè)函數(shù)在我的另外一個(gè)小游戲中也有用到,美女找茬。
注冊(cè)全局快捷鍵的就不想貼啦,我的另外一篇博客專門講了機(jī)制和用法:http://www.cnblogs.com/learn-my-life/p/3382703.html?
六、小結(jié)
最初的想法就是寫一個(gè)類似現(xiàn)在的小游戲來學(xué)習(xí)技術(shù),當(dāng)目標(biāo)達(dá)到的時(shí)候卻發(fā)現(xiàn)我可以繼續(xù)做下去,可以把我會(huì)的一些知識(shí)都給容納進(jìn)這個(gè)游戲,想到的一些新點(diǎn)子也會(huì)通過學(xué)習(xí)的方式逐步添加進(jìn)來,先扯一些唄,傷害計(jì)算系統(tǒng),網(wǎng)絡(luò)游戲有3種傷害計(jì)算公式,減法、除法、乘法,到時(shí)候在這里實(shí)踐一下。玩家信息記錄模式,給出一些可選的角色列表,每個(gè)角色分別有移動(dòng)速度增強(qiáng)、傷害增強(qiáng)等特性,玩家的信息在一次結(jié)束游戲后被加密保存至指定目錄。信息查看面板,主面板保持最簡(jiǎn)潔,顯示武器裝甲分?jǐn)?shù),其他的信息通過切換畫面提供等。也會(huì)增加更多游戲元素,絢麗多變的武器,敵機(jī)根據(jù)地位會(huì)攜帶相應(yīng)的裝備。從練習(xí)的角度來看,肯定是優(yōu)先實(shí)現(xiàn)那些用到了不同技術(shù)的功能,我會(huì)繼續(xù)把這個(gè)游戲做下去,有興趣的同學(xué)請(qǐng)加個(gè)關(guān)注。
轉(zhuǎn)載于:https://www.cnblogs.com/learn-my-life/p/3396714.html
總結(jié)
以上是生活随笔為你收集整理的射击的乐趣:WIN32诠释打飞机游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件读写和文件指针的移动
- 下一篇: Hive的安装和配置