1. 程式人生 > >C++ 飛行射擊遊戲設計全程實錄

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

Ha = Ya2-Ya1

矩形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: