以下大部分來自網(wǎng)絡(luò),只做學(xué)習(xí)記錄用。
一 框架層面
二 Lua層面
三 工具層面
四 android打包
一 框架層
整體來說,cocos2dX提供的一個(gè)簡便的框架,包含了渲染,動(dòng)畫,事件分發(fā),網(wǎng)絡(luò)還有UI,物理引擎等幾大模塊。對(duì)于做一個(gè)游戲從功能上來說已經(jīng)
足夠了。我從這幾個(gè)方面分別探討下cocos2dX的優(yōu)缺點(diǎn)以及我們?cè)陧?xiàng)目中是如何用到的
(1)渲染:渲染這塊,他的渲染數(shù)據(jù)跟Sprite進(jìn)行了綁定,然后對(duì)于openGl也是直接進(jìn)行了調(diào)用,而不是采用策略或者插件進(jìn)行調(diào)用。對(duì)于后期如果采用DX的話
我覺得這塊比較冗余些。但是這些并不會(huì)影響游戲的渲染速度。它提供了batch來進(jìn)行批次渲染。所以在游戲里,我們對(duì)資源進(jìn)行了分組,然后分別用textPacker
拼成一張圖片,格式呢 沒有alpha的采用 RGB565,有alpha的采用RGBA4444,要求高的話就采用RGBA8888,然后統(tǒng)一采用批次渲染。游戲的速度會(huì)提升很多。
對(duì)于游戲數(shù)據(jù)的管理,cocos采用CCTextureCache這個(gè)單例類進(jìn)行管理。釋放可以采用全部釋放,還有釋放沒有用過的。并且也提供了異步加載動(dòng)畫資源的方法
(PS:這個(gè)對(duì)于想做ARPG的同學(xué)來說,可是好東西了)。所以對(duì)于渲染這塊,我們盡量用批次,然后記得釋放內(nèi)存就OK了。
(2)動(dòng)畫:cocos他提供了一套action機(jī)制。整體來說,是sprite run action。然后驅(qū)動(dòng)action里面的動(dòng)畫數(shù)據(jù),進(jìn)行播放動(dòng)畫。所有的動(dòng)畫都可以走action
接口。對(duì)于使用者來說,也不用去關(guān)心其他東西,只需要初始化好你想要的動(dòng)作,然后把動(dòng)作數(shù)據(jù)塞給action。然后讓sprite run 就可以了。大概action就是這個(gè)
流程。本來我們想自己寫自己的動(dòng)畫,但是到后期,因?yàn)樽约簩懸惶坠ぷ髁看?。所以?duì)于move,scale什么的仍舊采用cocos自己的。只有animation采用了我們的。
但是現(xiàn)在想起來,完全沒有必要。cocos提供的已經(jīng)足夠了。我們所需要做的就是把動(dòng)作編輯器導(dǎo)出的動(dòng)畫數(shù)據(jù)用cocos的動(dòng)作翻譯(對(duì)于動(dòng)作編輯器我后面會(huì)講)寫
這么一個(gè)層就好
(3)事件分發(fā):cocos對(duì)于事件分發(fā)這塊就比較弱了。他是事件管理是通過存儲(chǔ)每一個(gè)object以及他接收事件的優(yōu)先級(jí)。然后進(jìn)行分發(fā)。但是他并沒有對(duì)場景進(jìn)行樹的管理
。所以我們的改變就是建立起場景樹,然后事件分發(fā)先從場景頂端往下分發(fā)。期間每個(gè)節(jié)點(diǎn)可以設(shè)置是否響應(yīng)以及是否繼續(xù)往下傳遞的屬性(作為OC出身,這塊完全模仿蘋果那套)
完全丟棄了cocos的那一套事件分發(fā)機(jī)制。對(duì)于場景樹的維護(hù),只需要每次step的時(shí)候更新下。所以對(duì)于查詢性能需要好好寫一下
(4)網(wǎng)絡(luò):cocos提供了對(duì)curl的封裝。提供了http的一些簡單比如get,post的封裝。但對(duì)于斷點(diǎn)續(xù)傳等并沒有封裝。對(duì)于socket,cocos則完全沒有提供。我們采用了
BSDSocket
(5)UI:UI這邊,cocos提供了幾種簡單的控件,比如CCButton等。他們都繼承于CCSprite,但是太少。而且初始化方法是在是太過于奇葩。所以我們自己寫了一套UI。
(其實(shí)無非也就是 button,label,tableView,scrollView,image還有textInput)他們也都繼承CCSprite。然后加入一些每個(gè)控件獨(dú)有的邏輯就可以了。最麻煩
的應(yīng)該就是textInput了。照著cocos提供的input寫一遍,然后改改。(cocos提供了CCEditeBox,但是這貨的的解決辦法是在IOS上調(diào)用IOS的的控件。但是他是直接加到了egLView上,對(duì)于頁面移動(dòng),頁面關(guān)閉處理起來比較麻煩。
所以這個(gè)暫時(shí)還不能用)
二 lua
為了讓游戲更有靈活性,cocos提供了lua。由C++做引擎,然后lua去寫邏輯。這樣就可以繞開蘋果的審核。我們就討論下C++與lua碰到的問題。
(1)通訊:cocos采用了tolua++來進(jìn)行C++與lua的通訊??碈ocos2dXLuaLoad文件里,那些就是lua與C++通訊的一個(gè)層。具體通訊原理比如是通過
棧,什么的我就不講了(其實(shí)我也不太懂)。這些東西tolua++都已經(jīng)替咱封裝好了。我們需要做的就是寫好C++文件
然后生成load文件。在CCLuaEngine里調(diào)用你生成的那個(gè)load方法。lua就可以訪問C++了。需要說明的是,我們這邊盡量是lua調(diào)用C++的方法,C++不會(huì)去調(diào)用
Lua的方法。調(diào)用也是通過callBack去調(diào)用。
(2)問題:
問題1.當(dāng)C++里面的函數(shù)需要傳遞lua指針時(shí):在C++里,lua的函數(shù)指針是一個(gè)int的變量。生成時(shí)用Lua_Func來代替。然后生成后執(zhí)行cocos2dX源碼
里面build.xml。xml的左右就是定制tolua++的生成。在里面把lua的函數(shù)指針轉(zhuǎn)成了int了。具體的看xml內(nèi)容就可以了。
問題2.在CCLuaEngine里調(diào)用那些load方法時(shí),是有順序的。一定要父類在前,子類在后。不然子類就無法訪問父類的方法。
(3)寫法:
lua都要加入module,變成模塊化,提高代碼的可讀性,然后require的時(shí)候一定要像cocos例子那樣,寫全路徑。不然打包android的時(shí)候
就悲劇了。
lua里面不要用全局變量持有sprite等C++數(shù)據(jù)。每個(gè)模塊也要像cocos那樣提供2個(gè)方法,一個(gè)是進(jìn)入該模塊的初始化方法,一個(gè)是退出
該模塊的銷毀方法。
對(duì)于lua這邊寫法,我們參考了 moai,還有corona,在lua那邊在封裝下C++,其他lua不是直接調(diào)用C++,盡量不要讓lua的寫法太過于
活躍。不然以后調(diào)試真心頭大。
(4)調(diào)試:lua的調(diào)試是最大的問題。僅憑一個(gè)lua_error所報(bào)錯(cuò)的信息是完全不夠的。而且Xcode對(duì)于lua的語法高亮支持的也不好。我們對(duì)此
進(jìn)行了2方面的嘗試
1.windows下,用decoda。然后也可以打斷點(diǎn)。
2.mac下,暫時(shí)用Eclips加lua插件進(jìn)行寫lua,然后通過log進(jìn)行調(diào)試。不過最近想嘗試Vim,應(yīng)該會(huì)比之前靠譜。
三 工具層面
工具上,cocos提供了 cocosBuilder,我覺得他屬于一個(gè)集成的工具。想要追求全,必然不精。所以cocosBuilder不管是
場景編輯,界面編輯,還是動(dòng)作編輯都不是很好用。所以我們采用的策略是用Flash的那一套。界面編輯用FlexBuilder的界面編輯,然后
導(dǎo)出xml,寫一個(gè)xml翻譯類,根據(jù)xml創(chuàng)建面板,動(dòng)作編輯用FlashPro。然后用jsfl讀出flash信息,導(dǎo)出xml,用cocos自己的action機(jī)制
去翻譯,演繹。場景編輯的話,我們的游戲并沒有用場景編輯的需求,所以沒有進(jìn)行研究,不過titleMap是個(gè)不錯(cuò)的選擇
四 andrid打包
android打包,其實(shí)難點(diǎn)在于調(diào)試。因?yàn)闊o法打斷點(diǎn)。本來lua就難調(diào)試,結(jié)果還要加上android。打包android那邊就是多看看NDK,JNI的
一些資料,然后了解mk文件怎么書寫??纯碿ocos提供的那些sh腳本。打包大部分問題都是路徑的問題。根據(jù)錯(cuò)誤一步步來,別急,肯定能打上。
打包完成以后,剩下就是調(diào)試。調(diào)試的話主要就是C++與java之間的通訊了。那就要多看看jni的一些東西。然后看cocos/platform/ 還有android
里面的類。那些是c++跟java通訊的類。我們調(diào)試主要就在那打log。jni的原理我就不講了。。多看看懂一點(diǎn)就可以了。畢竟咱只是為了看懂,會(huì)照貓畫虎
寫一點(diǎn)。沒必要深究。對(duì)了,android好奇葩,上網(wǎng)還需要權(quán)限配置?。?!在mainfest.xml配置權(quán)限???,搞了好久這個(gè)問題。
好了,我對(duì)于cocos的見解就這么些??赡馨薱ocos所有的東西吧。都不細(xì),只是給大家當(dāng)一個(gè)消遣時(shí)間的東西。歡迎大家一起討論。
最后,感謝cocos2dX的那些大牛們。是你們的無私讓我們才有機(jī)會(huì)這么容易接近游戲開發(fā)。謝謝你們