1. 程式人生 > >cocos2dx遊戲如何架構

cocos2dx遊戲如何架構

宣告:此篇文章不介紹如何使用cocos2dx製作遊戲。站在架構師的角度如果製作遊戲。

 

以我多年的遊戲開發經驗,和其他技術積累, 市面的所談的一些軟體架構模式都不太適合遊戲軟體。

我指的架構模式,MVC、MVP、MVVM、MVI。  他們只適合應用軟體裡,以資料為主導的,顯示為輔的功能性軟體裡。

web應用如 淘寶,或者某某管理後臺, 都是資料為主導,有一堆商品資料,使用者資訊資料。網頁上做的事情基本上概括為增刪改查,

大部分應該沒有這樣需求吧, 10個按鈕中,可以隨意拖動按鈕,然後下次進入時,在按照使用者拖動後順序顯示出來。

假定拖動是在一個小容器中,那麼推動的過程還需要檢測位置資訊然後進行設定位置資訊。 一個物體的變化,引起周邊UI的變化。

我舉這個例子,是想強調大部分WEB應用都不是UI強互動型的。包括大部分軟體。 

應用型軟體上屬於功能性軟體,比如拍照,記事本,聊天。

 

遊戲軟體特性特點:

需要和使用者實時互動,UI渲染,核心主要介面表現層和遊戲玩法上,而遊戲玩法成千上萬

遊戲玩法往往和介面緊密相連,比如麻將遊戲,手上有14張牌,玩家打了一張牌,如何知道玩家打的是什麼什麼牌,

我相信百分九十遊戲程式設計師,應該會直接 ui.cardValue   類似這樣的方式吧。

再比如建立房間面板,

經過一堆選項設定之後,你如何清楚的知道使用者選擇的是什麼。不可否認,這個可以按照MVC或者MVP模式或其他來設計。

但是你經常需要思考,Model是裡面有哪些資料,應該有哪些行為。 控制器會有幾十事件監聽,view可以交給cocos studio工具,但是也需要定義很多狀態改變的東西。

遊戲軟體基本上屬於互動式軟體。經常操作手機螢幕控制UI顯示。

 

我總結了幾個遊戲開發中經常需要解決的幾個點:

1,某個事件產生時,UI當前的資料

2,某個事件產生時,UI在當前場景的位置

3,某個事件產生時,UI相對其他UI的位置。

4,重啟場景,需要完全恢復願狀態,如何設計【重啟APP】

5,某個事件產生,記錄所有UI的狀態 【點選建立建立,儲存使用者選擇,下一次進入該面板,直接上一次退出時狀態】

5,一個UI操作變化,引起周邊UI聯動變化 【某個英雄發動技能,身邊怪物都掉血或者死亡】

 

 

cocos2dx 引擎提供功能

聲音引擎

渲染引擎

網路工具庫

物理引擎

其他一些小工具庫,xml, json等等

 

我現在拋開聲音,網路,小工具等這些不談,只講渲染引擎。 因為這才是核心。 當然一個遊戲,不僅只有顯示。

幾個基礎: Node,Scene,Layer

我抽象了引擎,總結就幾句話

while(!isStop){

傳送事件

繪製scene

}

沒錯,這是核心。咱們寫的遊戲邏輯,基本上上都是繪製scene裡完成的。包括js和lua邏輯的執行(聲音,網路請求,下載等除外)

遍歷該scene下的所有節點,然後繪製。

 

遊戲引擎本身是UI驅動的, 有的人,非要按照MVC,MVP等非UI互動型的模式,這無疑增加了工作量,也不便於理解。

搞不好一個新招的同事,為了快速完成任務,直接把這個模式給玩砸了。

我不否認,這些模式其實都是比較好的,但用在遊戲開發真心不合適。

 

現在我只談cocos2dx-lua的開發架構模式.

我把scene當作是一個虛擬機器。 實現了一個觀察者模式  用來通知其他layer層,或者所有layer層。

有一個限制,禁止layer:addChild( layer ).    雖然引擎支援這種。 所有layer都是兄弟姐妹的關係,不存在父親兒子。

如果要實現那種點選一個按鈕,彈出一個介面的功能, 這個介面不應該做成node或UIPanel節點,因為可能要遮蔽事件的。

雖然兩者都支援,為了統一管理和邏輯實現,統一layer。 

runScene 相當於啟動一個虛擬機器。很顯而易見,同一時刻,只能執行一個scene,這是引擎的特性。

 

 

我的軟體結構裡

views

  scenes

    LoginScene.lua

    MainScene.lua

    GameScene.lua

  layers

    LoginbgLayer.lua

    LoginLayer.lua

    CommonDialog.lua

  nodes

    headNode.lua

 

 

自己實現一個

Game.Layer(csbFileName).   他繼承cc.Layer.create()

Game.Scene(). 他繼承 cc.Scene.create() 並實現一個觀察者模式的簡單模型。 

這個模式並非遊戲全域性,僅僅供layer層直接傳遞資訊。 runScene("xxxScene")是產生。

 

一切邏輯都寫在layer, 此layer是cc.Layer.create()子類。  

 

 

先暫時寫到這,有時間在寫,並把程式碼附上