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