C++ 飛行射擊遊戲設計全程實錄
一、 目的和原因
前段時間有點空閒,看了幾本關於windows遊戲程式設計的書籍。尤其看過雲風的《遊戲之旅-我的程式設計感悟》之後,小有感觸,學習是需要檢驗的。因此想動手寫個小遊戲。選擇做這個簡單的打飛機遊戲的原因:在小米手機上玩過一個打飛機的遊戲。就用這個題材好了,可以檢驗學習的成果。主要是C++ Windows API相關的遊戲程式設計,用GDI繪圖。
二、 過程
①一些想法
腦子裡大概有一些想法:遊戲不需要設計得太難,抽不出太多時間。只是為了檢驗,那遊戲的整個系統結構就儘量簡單化好了。
(1).單人遊戲,簡單鍵盤控制即可,不需要滑鼠
(2).遊戲元素簡單化,只有我方飛機(一架)和敵方飛機(數量和型別都隨機),且不設定關卡,不設定boss(這些東西想在後續階段性的其它款遊戲中實現)。
(3).沒有音效
②準備材料
一開始的時候嘗試在網上找一些教程,想自己繪製飛機,自給自足還真是個事⊙﹏⊙,最後放棄了。靠著該死的網路,我搜索了各種網站論壇,關鍵字:飛機素材,遊戲圖片,遊戲開發素材等。下面是我最後的戰果:
真的是下了不少啊,基本應該夠了。
③設計與編碼
1、 建立工程:Project(主目錄),Code(專案程式碼),Document(文件),Resource(圖片等)。利用VS2010建立Win32 Project,專案名稱:AircraftGame
2、 類設計
(1) 設計模式中建議過根據責任來劃分類。遊戲設計中經常會聽到一個“sprite”即所謂精靈的概念,大概簡單的說,遊戲中不管靜態,動態,所有顯示的東西都稱為精靈。結合這個飛機的遊戲來看,需要顯示各種圖片(飛機,子彈,炸彈什麼的),那就先設計一個“圖片”類。
初步設計並實現之後,簡單的做個測試。發現使用有些不便,因此又添加了一些處理並加上獲取點陣圖寬高的介面。
當我看到一個2D遊戲引擎的使用示例的時候,看到了這個方法,覺得很贊,就拿來用了,確實很方便。
(3) 有了精靈類,那麼接下來我設計了我方飛機類,因為主控飛機的特殊性,我使用的單例模式。我方飛機沒有什麼難點,其實對於我自己來說,唯一的難點就是碰撞檢測,我決定用簡單的矩形相交來判斷,在網上找到了一個簡單的判斷兩個矩形區域相交演算法覺得還不錯。
/*
判斷兩個矩形的中心座標的水平和垂直距離,只要這兩個值滿足某種條件就可以相交。
矩形A的寬 Wa
= Xa2-Xa1
矩形B的寬 Wb = Xb2-Xb1高 Hb = Yb2-Yb1
矩形A的中心座標 (Xa3,Ya3) =( (Xa2+Xa1)/2,(Ya2+Ya1)/2)
矩形B的中心座標 (Xb3,Yb3) =( (Xb2+Xb1)/2,(Yb2+Yb1)/2)
所以只要同時滿足下面兩個式子,就可以說明兩個矩形相交。
1) | Xb3-Xa3 | <= Wa/2 + Wb/2
2) | Yb3-Ya3 | <= Ha/2 + Hb/2
即:
| Xb2+Xb1-Xa2-Xa1 | <= Xa2-Xa1 + Xb2-Xb1
| Yb2+Yb1-Ya2-Ya1 | <=Y a2-Ya1 + Yb2-Yb1
*/
敵方飛機就更簡單些了。但是又稍有不同,就是需要隨機動態的產生敵機。沒有什麼難的演算法和結構。
(4) 下面就是設計子彈類,子彈我也分為我方子彈和敵方子彈。首先設計的是一個子彈基類,CBullet,需要注意的地方都已經添加註釋。子彈也沒有什麼難點,主要就是根據重新整理情況,計算位子和貼圖的索引和大小就可以了。
(5) 爆炸類,CExplosion這個超簡單了,真的沒有什麼好說的,爆炸位置固定,產生了之後按幀數顯示就可以了。
(6) 最後設計的遊戲控制器類。這個類主要是負責控制遊戲流程的。遊戲資源的載入介面呼叫,釋放。按幀進行重新整理等。並而外的讓這個類完成迴圈地圖的顯示。
遊戲執行的部分截圖:
程式碼和資源已經上傳csdn: