cocos2d-x-3.3-023-仿飛機大戰-總體分析和建模,cocos2dx3.3
原文同步發佈於我的wiki,查看原文或更新請移步:點擊開啟連結
總體分析
一開始得想明白了的問題
- 遊戲裡面的可見元素,採用is-a精靈,還是採用has-a精靈好: 直接繼承精靈使用於相對簡單的情形;而對於複雜的UI構成採用組合策略, 這時候用繼承Node,並採用has-a精靈的關係是不錯的選擇。
- 子彈發射這個動作的思考(包括產生敵機,英雄出場,補給出場等都適用這個問題),cocos提供的導演和情境是用於流程式控制制的;層是畫布;而精靈則是畫布上的元素,故在發射或者建立一個子彈時要指定他所屬於的畫布。之後子便彈自個兒播放動畫玩耍了。
- 層的使用,為了將相對獨立的ui展示分離,使得代碼耦合降低,將不同功能放到不同的層是個很好做法,如背景層,控制層等。
- 速度是每秒多少個像素點? 這個問題適用於其他元素,比如生命值,攻擊力,飛行速度如何取值等。在真真的遊戲Team Dev裡, 這個工作應該是有專們團隊進行策劃的。我們這裡就初步按照跑出來的效果進行調整了。
- 怎麼根據劇情或者關卡產生畫布上的角色呢?提供一個關卡管理器,他的動力源是調度器。給他設定一個調度器回調,然後在回調裡面不停的根據當前關卡的設定產生敵人,類似actionManager。
- 遊戲的整個過程就是拍電影: 總導演安排好人架好了攝像機,選好了拍攝情境,決定情境是否切換,這些大事兒總導演負責。細節交個手下的副導演, 副導演找群眾演員,找主角,負責安排出場順序,負責驅動場上的邏輯-碰撞監測。每個關卡的劇本是不一樣的。劇本管理員專門負責劇情的組態管理。
- 主角和群眾演員根據劇情配置分別化不同的妝,帶不同的裝備,不同的技能等。
- UI按鈕的顯示和主角的關係: 我的理解是這兩者應該不是is-a, has-a的關係,而是發布訂閱的關係。
一點拓展思考
- 也看了一些例子,包括上一篇提到的專欄,碰撞檢測是通過‘副導演(或者誰誰誰)持有子彈數組,敵人數組,來兩重迴圈進行碰撞檢測’嗎? 我的想法是, 碰撞檢測相關代碼由cocos的架構來實現並提供回調,用戶端代碼不用保留兩個數組並迴圈, 而是讓發射的子彈自己進行碰撞檢測,並根據相應回調進行狀態切換,這樣的遊戲代碼看上去更具美感點。
- 由上面的‘碰撞檢測’的問題引出本問題,採用上面的碰撞檢測方案的話, 遊戲裡面的精靈元素更像'提線木偶', 每一幀裡'副導演'都要喊'進行碰撞檢測了', ‘碰撞了就攻擊了’。。。 這會累死副導演的。 若精靈元素可自行檢測碰撞,並根據相關回調進行狀態切換,播放不同的動畫效果等,就可以將‘副導演’裡面的邏輯代碼放入不同的精靈元素中,這樣的代碼耦合性會降低,封裝性更好,更容易擴充。
- 物理引擎可以滿足上述需求嗎?
- 答案見下一節。
物品詳細分析
飛機: 我方戰鬥機, 敵人飛機, 都是飛機, 陣營不同而已 飛機可被傷害 飛機可被修複 飛機有槍 飛機用槍發射子彈 飛機有飛行速度 飛機有方向 飛機能得到補給 槍:發射子彈 槍有子彈 不同類型的槍一次發射的子彈數量不同,發射的子彈也不同 子彈:有殺傷力,體現為威力 子彈殺傷敵人後自己的生命週期也結束了 子彈無眼?子彈有眼?即子彈可以傷害同一陣營的人嗎?先無眼吧,不糾結 子彈有速度 子彈有起始位置 子彈有方向 補給-血包:+血用 補給-雙排槍:換槍,子彈打光後再換回預設的槍 補給-炸彈:給飛機掛幾顆飛彈,發射後全屏滅怪 補給有速度 補給有起始位置 補給有方向
建立類族類圖如下
https://github.com/cheyiliu/All-in-One/raw/master/res/cocos2d/warofairplain.jpg
說明
Role: 角色類定義,屬性有:隊伍,血量,攻擊力,資源等; 行為有:判斷是敵是友,攻擊,被攻擊,獲得各種補給; 提供靜態Factory 方法RoleHero: 英雄,屬性有:多把槍用於遠程攻擊;可以獲得各種補給等;RoleEmemy: 敵人:只能有攻擊和被攻擊行為。RoleEnemy有3個子類,代表大中小型敵人,負責用不同的資源來執行個體化
Supply: 補給類,定義了基本方法;和Factory 方法。Supply有3個子類,負責不同的補給工作。
Gun: 槍,功能是開火發射子彈;包含靜態Factory 方法。Gun有3個子類,裝有不同的子彈,代表不同的槍。Bullet: 子彈基類,屬性有威力,資源等;行為有殺傷;同時有靜態Factory 方法(後期開發看需求是否需要單獨分離出工廠類)Bullet有3個子類,代表不同類型的子彈。
為何要提供這麼多子類呢, 每個系統有好幾個子類, 我的想法是在選用不同資源代表不同類型的物體時不想用太多的if else。不子類化那麼父類將承載過多的判斷語句。上述的補給系,槍支彈藥系都作用于飛機系。
代碼草稿
- 最近用java比較多,先用java打了個草稿, 整理了下思路, 上述類對應的代碼在https://github.com/cheyiliu/test4java/tree/master/src/test/cocos/airplain
- 接下來就是用c++結合cocos的機制實現了。在實現過程中將盡量遵循上述類的關係。當然必要的調整也是難免的。