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