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