個(gè)人關(guān)于Cocos2d-x的一些看法及其發(fā)展展望
總體來說,cocos2d-x是一個(gè)優(yōu)秀的庫。
Cocos2d-x沒有很復(fù)雜的一個(gè)架構(gòu),基本上是一些以單件形式提供的管理器和是一些圍繞SceneGraph(CCNode及其派生類)展開的類。這個(gè)設(shè)計(jì)使得cocos2d在結(jié)構(gòu)上很簡潔,使用者很容易上手。
同時(shí)cocos2d的設(shè)計(jì)者充分利用了現(xiàn)成的一些游戲開發(fā)中的工具,將這些工具整合到引擎中來,例如BMFont、TexturePacker等工具,使得制作素材很方便。
作為一個(gè)跨平臺(tái)的游戲庫,cocos2d-x已經(jīng)做的非常好。 但如果將cocos2d-x定位為一款跨平臺(tái)的游戲引擎,我覺得Cocos2d-想可以朝以下幾個(gè)地方發(fā)展:
1、cocos2d-x可以提供一個(gè)好的游戲框架:
cocos2d-x提供的一些Demo,以及教人寫程序的方法基本是讓開發(fā)人員編寫一個(gè)CCScene的子類,通過子類化的方式來實(shí)現(xiàn)具體的邏輯,作為教學(xué)這樣非常好。
作為正式開發(fā),個(gè)人建議cocos2d-x可以提供一個(gè)具體的游戲框架,這個(gè)框架在總體上提供了一個(gè)移動(dòng)平臺(tái)的游戲的通用功能(例如:LoadingScene, TitleScene, HighscoreScene等等),游戲開發(fā)人員要做的只是根據(jù)自己游戲的情況來選擇定制自己的游戲。
2、cocos2d-x對(duì)游戲邏輯的支持可以增強(qiáng):
對(duì)開發(fā)這來說,怎么編寫游戲邏輯是一個(gè)麻煩的問題,Cocos2d-x用SceneGraph的方式來管理場(chǎng)景,很自然地,游戲開發(fā)人員肯定希望使用cocos2d-x提供的方式來管理對(duì)象,這樣就要從CCNode等對(duì)象派生,甚至有的開發(fā)人員還建議直接從CCSprite等萬能類派生類編寫功能代碼。這樣做的方式并非不可以,但作為一個(gè)好的開發(fā)人員,你以后會(huì)發(fā)現(xiàn)這樣帶來的問題非常多,例如:游戲復(fù)雜了之后,你會(huì)發(fā)現(xiàn)繼承關(guān)系層次很多,導(dǎo)致代碼需要不停重構(gòu)來適合新的需求,最后你設(shè)計(jì)的基類越來越復(fù)雜等等。
現(xiàn)在比較主流的方式是使用Entity-Component系統(tǒng)來組合出我們的邏輯。關(guān)于Entity-Component系統(tǒng)這里就不再細(xì)說。僅僅簡單說明一下:游戲中的對(duì)象為一個(gè)Entity,每個(gè)Entity使用由一個(gè)或多個(gè)Component構(gòu)成。
例如游戲中的雷電游戲中的一架飛機(jī)可以由:Flyable(可飛行Component,提供飛行功能)、Shotable(可發(fā)射Component,提供發(fā)射子彈的功能)、Sprite(Sprite Component,提供顯示功能)、Colliable(碰撞Component,提供碰撞檢測(cè)的功能)構(gòu)成。
當(dāng)然僅僅有Entity-Component系統(tǒng),對(duì)于游戲框架來說還是不夠的。例如:當(dāng)子彈擊中飛機(jī)的時(shí)候,是直接調(diào)用函數(shù)嗎?直接調(diào)用當(dāng)然不好。首先子彈和飛機(jī)都是Entity,在外部來看,你不知道他們由什么Component組成,直接查詢Component并調(diào)用Component的函數(shù),這明顯就違背了封裝的原則。如果提供了消息系統(tǒng)Event System,通過給Entity發(fā)送消息,Entity中的組件收到消息后,由組建去處理自己關(guān)心的消息,這樣不僅實(shí)現(xiàn)功能,而且結(jié)構(gòu)有漂亮。
3、cocos2d-x對(duì)游戲開發(fā)工具的支持:
對(duì)于游戲開發(fā)引擎來說,優(yōu)秀的工具永遠(yuǎn)是第一位的。有了工具,游戲開發(fā)者就可以很快的時(shí)間做出原型,然后在這個(gè)基礎(chǔ)上,通過快速迭代優(yōu)化數(shù)值和表現(xiàn)來快速開發(fā)游戲。
以Cocosbuilder這樣一款工具來說吧,目前階段cocos2d-x要做一款這樣的功能的工具,還需要改善一下代碼。最基本的就是提供持久化(Persistence)的支持。可以任何時(shí)刻將游戲的內(nèi)容或者編輯器中制作的內(nèi)容保存到磁盤文件。以后需要的時(shí)候可以打開保存的文件。
要實(shí)現(xiàn)這些,我覺得有幾點(diǎn)基礎(chǔ)需要增加:
1、提供RTTI的支持;
- 可以讓一個(gè)對(duì)象在運(yùn)行是判斷是否是某類對(duì)象(PS:別告訴我用dynamic_cast來實(shí)現(xiàn)。),具體實(shí)現(xiàn)可以參考很多現(xiàn)成的方案;
2、提供類工廠的支持;
- 可以根據(jù)文件中的保存的類名等來構(gòu)造出相應(yīng)的類,例如:讀到"CCNode"的時(shí)候,可以根據(jù)"CCNode"來創(chuàng)建出CCNode對(duì)象;
3、提供對(duì)象屬性的設(shè)置;
- 當(dāng)讀取到一個(gè)屬性名稱和數(shù)值的時(shí)候,提供一個(gè)方式來設(shè)置對(duì)象的屬性。例如讀取到osition的時(shí)候,提供一個(gè)方式來設(shè)置node->setPosition(xxx)。
以上這些是個(gè)人的一點(diǎn)設(shè)想,希望大家也提出自己的意見。