quick-cocos2d-x(後文簡稱 quick)與 cocos2d-x 的關係,用一句話歸納:quick 是 cocos2d-x 針對 Lua 的豪華套裝威力增強版。
那 quick 與 cocos2d-x 相比到底有什麼區別,又有什麼增強呢?這篇文章就是答案:
爲何會有 quick
quick 和 cocos2d-x 的差異
quick 由哪些部分組成
應該選擇 Lua 仍是 JavaScript
怎麼入門 quick
爲何會有 quick
cocos2d-x 是一個用 C++ 開發的遊戲引擎,其架構設計和 API 基本上是照搬的 cocos2d-iphone(一個用 Objective-C 的 iOS 遊戲開發引擎)。
因爲 C++ 對開發人員要求較高,因此網龍科技利用 tolua++ 這個工具,將 cocos2d-x 的 C++ 接口轉爲了 Lua 接口(這種將 C++ 接口導出爲 Lua 接口的庫一般稱爲 luabinding)。讓開發者可使用 Lua 這種簡單易懂的腳本語言來編寫遊戲,從而大大提升開發效率。
大概在 2012 年上半年,咱們公司開始使用 cocos2d-x + Lua 來開發遊戲。可是發現當時 cocos2d-x 對 Lua 的支持還存在至關多不完善的地方。因此我重寫了整個 luabinding 的支持代碼,解決了內存泄露、只能使用全局函數作回調等問題。
在 cocos2d-x 2.0 發佈後,luabinding 又進行了很多改進和完善。截止到 cocos2d-x 2.1.4,整個 luabinding 已經能夠說是至關穩定了。因此《我是 MT》、《大掌門》這些賺錢像印錢的遊戲,就紛紛採用 cocos2d-x + Lua 的解決方案了。
惋惜 cocos2d-x 團隊從 2012 年以來一直在強力推廣 cocos2d-x 的 JavaScript 解決方案,因此在 Lua 支持上基本上就沒有什麼大動做了。而從咱們使用 Lua 解決方案的開發商看來,須要 luabinding 具有更強大的功能,所以這就是咱們開發 quick 的最初緣由。
quick 的目標:
下降學習曲線
提升易用性
建立一個精簡、但更容易擴展的架構
quick 和 cocos2d-x 的差異
雖然 cocos2d-x luabinding 已經很完善了,可是要開發一個遊戲,咱們還須要作許多基礎工做。
將 luabinding 導出的 C++ 接口從新封裝成 Lua 風格的接口是最基本的工做。從新封裝後的接口應該更容易學習和使用,而且一些 C++ 和 Lua 之間數據格式轉換也應該隱藏起來。而這就是 quick 裏首先實現的目標。
看看下面的代碼:
-- 載入 Sprite Sheet
local frameCache = CCSpriteFrameCache:sharedSpriteFrameCache()
frameCache:addSpriteFramesWithFile("Sprites.plist", "Sprites.png")
-- 構造一個幀動畫序列 Run0001.png -> Run0010.png
local frames = CCArray:create()
for index = 1, 10 do
local frameName = string.format("Run%04d.png", index)
local frame = frameCache:spriteFrameByName(frameName)
frames:addObject(frame)
end
-- 建立 CCSprite 對象
local firstFrame = tolua.cast(frames:objectAtIndex(0), "CCSpriteFrame")
local sprite = CCSprite:createWithSpriteFrame(firstFrame)
-- 在 CCSprite 之上播放動畫(用 0.5 秒播放完 10 幀)
local animation = CCAnimation:createWithSpriteFrames(frames, 0.5 / 10)
sprite:runAction(CCRepeatForever:create(CCAnimate:create(animation)))
這段代碼的功能在遊戲中會反覆出現,因此一般會封裝成幾個簡單的函數。而 quick 裏封裝後的接口要完成一樣功能會使用以下代碼:
display.addSpriteFramesWithFile("Sprites.plist", "Sprites.png")
local frames = display.newFrames("Run%04d.png", 1, 10)
local sprite = display.newSpriteWithFrame(frames[1])
local animation = display.newAnimation(frames, 0.5 / 10)
sprite:playAnimationForever(animation)
經過這個對比,能夠看出二次封裝是多麼必要。而 quick 提供了一個 Lua Framework,封裝了大量最經常使用的接口。
cocos2d-x 是一個功能完善的遊戲引擎,但對於一個能掙錢的遊戲來講,cocos2d-x 還缺乏不少必須的功能。因此 quick 在 cocos2d-x 基礎上添加了更多遊戲必須的功能,例如完善的 HTTP 和 Socket 網絡功能、數據加密解密、設備功能訪問等等。
遊戲的玩法作得差很少了,就須要開始集成付費充值、統計、社會化分享、好友鏈等各類第三方 SDK。
在 iOS 和 Android 平臺上作這些工做,傳統作法是分別編寫 Objective-C 和 Java 的接口代碼,而後再用 C++ 中轉,藉助 tolua++ 導出給 Lua 使用。這種作法不但繁瑣,並且像 Java 和 C++ 的交互存在至關多的困難,因此開發效率極低。
quick 針對這個問題,特別開發了 LuaObjectiveCBridge 和 LuaJavaBridge 兩個模塊。利用這兩個模塊,咱們在接入 SDK 時,就再也不須要 C++ 中轉層,也不須要 tolua++,由此省下的工做量至關驚人。
並且 quick 的附屬項目會提供大量現成的 SDK 封裝,進一步提升開發效率,讓開發商把主要的資源花在遊戲玩法上。
在開發過程當中,須要不斷測試。而 cocos2d-x 自帶的 Windows 和 Mac 模擬器功能太簡單。quick 特別開發了功能完備的模擬器,讓整個遊戲在開發階段的大部分時間裏都不須要藉助真機就能夠進行(小夥伴們都知道,Android 真機調試那麼是多麼的蛋疼)。
看看 quick 華麗的模擬器吧 :)
除了上述內容,quick 裏還包含了物理引擎 Chipmunk 2D 的 Lua 封裝(相信我,你不可能找到比這個更容易使用的物理引擎接口)、骨骼動畫播放(支持 DragonBones、CocoStudio)、高性能的 LuaJIT 虛擬機等等。
總結而言,quick 和 cocos2d-x 的主要區別有以下幾點:
更完善的 Lua 支持,包括一個 Lua 框架對 C++ 接口進行了二次封裝
補充了大量 cocos2d-x 沒有提供,但遊戲須要的功能
爲提升開發效率,提供了 Objective-C 和 Java 的橋接模塊,以及強化的 Windows/Mac 模擬器
除了這些重大區別外,quick 還在細節上作了一些調整和完善。而且後續還會未來自 cocos2d-x 最新開發分支(devel 3.0)的一些重要 bugfix 和有價值的新功能移植到 quick 中。
固然,當 cocos2d-x 3.0 徹底穩定下來的時候,quick 也會作相應的升級。
quick 由哪些部分組成
quick 由幾個主要部分組成:
cocos2d-x:目前基於 cocos2d-x 2.1.4 版本
tolua++:用於將 C++ 接口導出給 Lua 腳本使用
LuaJIT:最快的 Lua 虛擬機
cocos2d-x-extra:擴展功能,包括數據加密編碼、網絡傳輸、設備功能訪問等
Chipmunk 2D:物理引擎,以及相應的 cocos2d-x 和 Lua 封裝接口
CSArmature:一個骨骼動畫播放庫,支持 DragonBones 和 CocoStudio 建立的骨骼動畫
除此以外,還包含一些 Lua 的擴展:
lua_extensions:一些必備的 Lua 模塊,包括 JSON、ZLib、LuaFileSystem、LuaSocket 等
LuaJavaBridge:簡單的 Lua - Java 交互接口,簡化 SDK 集成
LuaObjectiveCBridge:簡單的 Lua - Objective-C 交互接口
應該選擇 Lua 仍是 JavaScript
目前 cocos2d-x 支持兩種腳本語言的 binding,從我我的瞭解,各自的狀況列表以下:
Features Lua JavaScript
徹底訪問 cocos2d-x API YES YES
iOS 平臺 YESYES
Android 平臺 YESYES
Windows 平臺 YESYES
Mac 平臺 YESYES
Linux 平臺 YES*YES
HTML5 平臺 NOYES
JIT 支持 YESYES
編譯爲字節碼 YESYES
字節碼是否能夠反編譯 NONO
運行性能 HIGHLOW
接入 SDK 工做量 簡單複雜,經過 C++ 中轉
導出自定義 C++ 類 簡單複雜
而我最看重其中幾點:
運行效率:LuaJIT 編譯的字節碼在 JIT 可用時,運行效率能夠接近 C 的程度。而在 iOS 這種不支持 JIT 的環境裏,Lua 的運行效率比 JavaScript 高不少()。
是否容易擴展:Lua 從設計時就是做爲嵌入式語言來設計的,因此須要將某個 C/C++ 接口導出給 Lua 使用,那是至關輕鬆的事情。
源代碼保護:LuaJIT 編譯的字節碼目前是沒法反編譯的,由於 LuaJIT 在編譯時不是 1:1 直接轉換源代碼,而是對源代碼作了至關多的深刻優化。LuaJIT 編譯出的字節碼體積是 Lua 編譯字節碼的三分之一,因而可知優化程度。
客觀的說,JavaScript binding 最大的優點是之前大量的 JS 前端開發人員能夠很容易的上手,並且支持 HTML5 平臺。但若是從手遊體驗來講,Lua 的運行效率是很重要的優點。
怎麼入門 quick
東西再好,學不會也是白搭,因此這篇文章的重點是這個部分,前面都是廣告 :)
學習 Lua
Lua 是一種簡單易用的語言。學習這種語言最好的方式就是花幾天時間寫代碼,而後在命令行中運行。
重點:
table 在 Lua 中是一種萬能數據結構,既能夠表示數組,又能夠表示名值對。這和 PHP 裏的 array 同樣。惟一的區別在於 table 用做數組時,第一個元素的下標是從 1 開始。
function 在 Lua 裏是 first-class 類型,也就是說你能夠把一個 function 當作普通值,傳遞來傳遞去,這和其餘函數式編程語言是同樣的,例如 JavaScript。
Lua 裏用 table 配合 metatable 實現面向對象。因爲 C++ 對象導出到 Lua 裏後就是這樣的機制,因此這個必定要搞明白。
搞清楚在定義方法和調用方法的時候,用「.」和「:」的區別。
嘗試修改和完善 quick 的各個示例程序
用 quick-x-player(quick 裏牛叉的模擬器)運行 sample 目錄裏的各個例子,無差異爆改。改一點就按 F5(Mac 上按 CMD+R)刷新模擬器看看效果(作過 Web 前端的童鞋感動吧),要不了幾天就成熟練工了。
最常遇到的問題:
這個方法返回了一個什麼對象?
由於 quick 裏對 C++ 接口進行了二次封裝,因此一些框架的方法返回的對象不必定很明確。但大多數能夠從方法名上推測出來:
display.newSprite() 建立 CCSprite 對象
display.newFrames() 建立包含多個 CCSpriteFrame 對象的數組
ui.newImageMenuItem() 建立 CCImgeMenuItem 對象
ui.newMenu() 建立 CCMenu 對象
實在看不出來,那就去 framework 目錄裏翻源代碼吧。
這個方法是幹嗎的?
首先,從 framework 裏找。找不到就去 cocos2d-x 裏找。還找不到,那就是 cocos2d-x-extra 或者第三方庫提供的方法。這裏強烈推薦 Sublime Text 這個超神的編輯器,全文檢索神馬的徹底不在話下。
爲何代碼沒有預期的效果?
無論是 Lua 仍是 quick,當前的版本都很是很是穩定。因此遇到這種狀況,不要首先懷疑語言特徵或者引擎,而是多作測試,看看問題究竟是怎麼發生的。
在哪裏尋求幫助?
目前 quick 尚未專門的社區,因此若是你想尋求幫助,最快捷的途徑就是 QQ 羣:284148017 。固然,不會有誰整天沒事兒在那裏義務解答,因此 QQ 羣更可能是交流經驗的地方。將來,quick 會創建本身的社區,方便你們的交流。
熟悉 cocos2d-x API
本質上,quick 是 cocos2d-x 的一個加強版本,因此熟悉 cocos2d-x API 是基本要求。好在 cocos2d-x 目前已經有至關豐富的學習資料,即使是 C++ 代碼的,改寫爲 Lua 也很是簡單,也就語法的區別而已。
這個階段能夠用 quick 裏的 CoinFlip 示例爲基礎,添加更多玩法或功能。CoinFlip 已經具有一個完整遊戲的雛形,因此可以在 CoinFlip 中自在添加功能時,也就達到能夠獨立開發遊戲的程度了。
學習使用擴展功能和第三方 Lua 擴展
quick 裏包含了至關豐富的擴展庫,從支付到網絡服務都應有盡有。而這些功能也是遊戲從項目變成產品時必須的,因此在熟練掌握擴展功能能夠大大提升開發效率,避免重複勞動。
在學習擴展功能時,要了解這個擴展功能是基於什麼開源項目來開發的,這樣才能找到有針對性的學習資源。例如 LuaSocket、LuaFileSystem 等 Lua 擴展、Chipmunk 2D 物理引擎等等,它們的用法在各自項目的網站上都能找到。
導出本身的 C++ 對象到 Lua
有時候須要編寫一些 C++ 對象,而後導出給 Lua 使用。這裏能夠參考 lib/cocos2dx_extra/extra/luabinding 裏的 *.tolua 文件,將 C/C++ 頭文件轉爲 tolua++ 須要的文件,而後藉助 quick 中附帶的腳本編譯成 luabinding 接口。
在 quick 項目的 wiki 中,也有其餘相關的文檔能夠參考。
集成第三方 SDK
quick 有一個附屬倉庫 quick-cocos2d-x-plugins,其中包含了一些 SDK 的接口文件。參考 sample/luajavabridge 示例和這些接口文件,很容易就能完成 SDK 的集成。
後續 quick 也會提供更多的 SDK 接口,以及相應的示例代碼。
- END -前端
轉自:http://blog.csdn.net/kaitiren/article/details/35276177java