您好,登錄后才能下訂單哦!
【嘮叨】
本節(jié)要講的是如果將自己寫的C++類注冊(cè)進(jìn)Lua環(huán)境,讓Lua去調(diào)用自定義的C++類。
網(wǎng)上有很多都是用原始的tolua++工具來(lái)注冊(cè)C++類的,我看了很多這樣的教程,感覺(jué)操作起來(lái)十分麻煩,而且也很難看懂他們到底在講什么。
其實(shí),在cocos2dx v3.2版本中,提供了bindings-generator腳本來(lái)封裝toLua++的用法,從而節(jié)省了工作量。
【致謝】
http://segmentfault.com/blog/hongliang/1190000000718145 (講得非常好!)
http://cn.cocos2d-x.org/article/index?type=code-ide&url=/doc/cocos-docs-master/manual/code-ide/binding-custom-class-to-lua/zh.md (官方文檔)
【使用工具】
Windows7 x64
Cocos2dx v3.2
Cocos Code IDE 1.0.1 (支持自定義類的智能提示功能)
python 2.7.x(v3.2版本不一定要2.7.3,我用2.7.8也成功了的)
NDK r9d ,解壓并配置環(huán)境變量NDK_ROOT(v3.2版本不一定要r9b,我用r9d成功了的)
pyyaml ,安裝到 "Python的安裝目錄\Lib\site-packages"
http://pyyaml.org/download/pyyaml/PyYAML-3.10.win32-py2.7.exe
Cheetah ,并解壓到 "Python的安裝目錄\Lib\site-packages"
https://raw.github.com/dumganhar/my_old_cocos2d-x_backup/download/downloads/Cheetah.zip
dos2unix ,windows下可能在執(zhí)行腳本時(shí)有這個(gè)錯(cuò)誤。
解壓到一某個(gè)目錄下面, 并設(shè)置PATH環(huán)境變量的值指向bin目錄下。
http://waterlan.home.xs4all.nl/dos2unix/dos2unix-7.1-win32.zip
【MAC】參見(jiàn):http://blog.csdn.net/guo_hongjun1611/article/details/39852873
【綁定方法】
以下介紹的是在 Windows7 + VS2013 + Cocos Code IDE。
并使用Cocos Code IDE創(chuàng)建的Lua項(xiàng)目,綁定方法。
1、將自定義的C++代碼放在 frameworks\runtime-src\Classes 下
當(dāng)然放哪里是隨意的,我喜歡放在Classes下。
2、添加自定義類的.ini文件
在 frameworks\cocos2d-x\tools\tolua 中,復(fù)制一份該文件夾下cocos2dx.ini的配置信息,然后修改一些參數(shù),改成我們自定義類的參數(shù)。
以下列出需要修改的參數(shù)配置:
[custom_api] # prefix會(huì)被添加到生成的函數(shù).你也可以選擇不添加這個(gè)到你的模板 prefix = custom_api # 所有的類都會(huì)嵌入到這個(gè)命名空間 target_namespace = my # 類所在的路徑,如果有多個(gè),用空格隔開(kāi) headers = %(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h # 需要注冊(cè)的類,如果有多個(gè),用空格隔開(kāi) classes = PanZoomLayer # 不提供給Lua的public成員函數(shù) skip = PanZoomLayer::[onTouchesBegan onTouchesMoved onTouchesEnded init onEnter onExit update] # 這些全空就好了 rename_functions = rename_classes = remove_prefix = classes_have_no_parents = base_classes_to_skip = abstract_classes = script_control_cpp = no
3、genbindings.py 添加自定義的配置.ini
在 frameworks\cocos2d-x\tools\tolua 的 genbindings.py 中的129行找到 cmd_args 。
將我們自定義的 custom_api.ini 添加進(jìn)去,并注釋掉其他.ini(這些已經(jīng)不需要重新生成)
4、運(yùn)行 genbindings.py 腳本
在終端運(yùn)行 genbindings.py 腳本。
在這里,我是直接寫了一個(gè)批處理文件 .bat 。
注意:只要需要用到的工具都下載,安裝,配置好了,一般就能生成成功。
生成失敗的,基本都是因?yàn)楣ぞ邲](méi)有配置好。
生成成功后,在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 中會(huì)找到我們生成的C++的橋接文件, lua_custom_api_auto.cpp 和 lua_custom_api_auto.hpp 。
其中 lua_custom_api_auto.hpp 中的 register_all_custom_api 就是我們用來(lái)將PanZoomLayer類注冊(cè)到Lua環(huán)境中的關(guān)鍵函數(shù)。
以及在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中也能夠找到我們提供給Lua調(diào)用的接口文件。
5、編譯注冊(cè)到Lua
注冊(cè)自定義類的函數(shù)在我們的 lua_custom_api_auto.hpp 中可以看到。
register_all_custom_api(lua_State* tolua_S)
使用 VS2013 打開(kāi) frameworks\runtime-src\proj.win32 下的工程。
(1)將自定義的類 PanZoomLayer 添加到項(xiàng)目工程的Classes下。
(2)將 lua_custom_api_auto.cpp、lua_custom_api_auto.hpp 添加到工程liblua的auto下。
(3)添加lualib工程的文件搜索路徑。
將 $(EngineRoot)../runtime-src/Classes 路徑加進(jìn)去。
(4)編輯 frameworks\runtime-src\Classes 下的入口類 AppDelegate.cpp
> 添加:lua_custom_api_auto.hpp 頭文件
> 注冊(cè):register_all_custom_api(state)
> 注意:register_all_custom_api 的上下兩句話,必須加上!
(5)編譯運(yùn)行整個(gè)項(xiàng)目,完成C++類的注冊(cè)到Lua。
然后就可以再Lua中愉快的使用自定義的類了!
【開(kāi)啟智能提示】
雖然我們將我們自定義的C++類注冊(cè)到了Lua中調(diào)用,但是在Cocos Code IDE中卻沒(méi)有我們自定義類的智能提示。
我們需要修改一些配置,讓Cocos Code IDE加上對(duì)我們自定義類的智能提示。
1、Cocos2dx引擎中的智能提示
首先我們來(lái)看一下Cocos Code IDE中cocos2dx引擎的智能提示是怎么搞的。
隨便找個(gè) cc.Label 把!
我們按住鍵盤的 ctrl 鍵,然后點(diǎn)擊 cc 和 Label,就會(huì)跳轉(zhuǎn)到聲明它們的地方。
文件跳轉(zhuǎn)到了如下兩幅圖的地方:
可能看到以上兩幅圖,你就明白應(yīng)該怎么給我們自定義的C++類加上智能提示了吧?
我們先找到以下文件路徑:(可能每個(gè)人的不一樣)
\CocosCodeIDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2
可以發(fā)現(xiàn)該路徑下有一個(gè) api.zip 這個(gè)壓縮包。
我們將其 api.zip 解壓出來(lái)看看里面都是什么東西。
可以發(fā)現(xiàn)里面全是cocos2dx的C++類提供給Lua的接口聲明。
這些也就是IDE中智能提示的原因。
2、添加自定義類的智能提示(方式一)
我們仿照 api.zip 中的 cc.lua 和 label.lua 來(lái)寫一個(gè)自定義類的接口聲明。
> my.lua :聲明命名空間
> PanZoomLayer.lua :聲明自定義類。(這個(gè)在使用腳本綁定時(shí),自動(dòng)生成)
其中 PanZoomLayer.lua 在使用 genbindings.py 腳本時(shí),就自動(dòng)生成了的。
就在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中。
那么,我們?cè)賹懸粋€(gè) my.lua ,也放在這個(gè)目錄下好了。
其中,my.lua 代碼如下:
-------------------------------- -- @module my -------------------------------------------------------- -- the my PanZoomLayer -- @field [parent=#my] PanZoomLayer#PanZoomLayer PanZoomLayer preloaded module return nil
PanZoomLayer.lua 代碼如下:
然后我們將 my.lua 和 PanZoomLayer.lua 一并壓縮到 myapi.zip 中。
就放在 \frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中好了。
然后我們打開(kāi)Cocos Code IDE的工程項(xiàng)目,配置屬性。
Lua->Build Path->Libraries->Add External Zips。
將我們的 myapi.zip 壓縮包添加進(jìn)去,點(diǎn)擊“確定”。
這樣,就可以在 Cocos Code IDE 中愉快的玩我們自定義的類了。
有智能提示,就是爽?。。?!
3、添加智能提示(方式二)
通過(guò)上面的方式一的方法雖然可以有智能提示,可是后來(lái)我發(fā)現(xiàn)定義的命名空間 my 卻無(wú)法識(shí)別。這樣的結(jié)果將導(dǎo)致創(chuàng)建的 my.PanZoomLayer:create() 賦值給 self 的成員 self.pzLayer 后,繼續(xù)使用 self.pzLayer 時(shí),對(duì)應(yīng)的函數(shù)又無(wú)法提示了。
所以這里我們通過(guò)修改官方智能提示包 api.zip ,來(lái)達(dá)到更加的智能提示的效果。
操作方法和方式一類似,我們先將官方的提示包 api.zip 解壓出來(lái),最好將其備份一份。
文件在:
\Cocos Code IDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2
然后我們將我們自定義提示包 my.lua 和 PanZoomLayer.lua 放入 api 文件夾中。
然后在 api 文件夾中找到 global.lua 這個(gè)全局聲明文件。
將我們自定義的命名空間 my 聲明進(jìn)去。
-- the my module -- @field [parent=#global] my#my my preloaded module
保存關(guān)閉,將 api 文件夾壓縮成 api.zip 包。
然后刷新我們的項(xiàng)目工程,然后再來(lái)試試我們自定義類的智能提示效果。
可以發(fā)現(xiàn),自定義的類的智能提示已經(jīng)和 官方的智能提示功能 完全一致了。
又可以愉快的玩耍啦?。?!
【遇到的問(wèn)題】
1、腳本生成出錯(cuò)
這些出錯(cuò)都是由于沒(méi)有配置 pyyaml、Cheetah、dos2unix 引起的,都下過(guò)來(lái)配置一下即可。
2、編譯到Android手機(jī)出錯(cuò)
上面的配置完成后IOS的部分是可以正常運(yùn)行的,但是這個(gè)時(shí)候編譯android時(shí)不通過(guò)的。
因?yàn)?AppDelegate.cpp 里面調(diào)用的 register_all_MyClass(L) 方法在android不存在,android的項(xiàng)目里并沒(méi)有配置去編譯對(duì)應(yīng)的 PanZoomLayer.cpp 文件和后續(xù)生成的 lua_custom_api_auto.cpp。
所以需要在android端配置Android.mk文件,讓項(xiàng)目編譯時(shí)去編譯這兩個(gè)C++文件才行。
(1)首先配置JNI下面的Android.mk文件,讓JNI部分編譯時(shí)去編譯PanZoomLayer.cpp:
編輯 frameworks/runtime-src/proj.android/jni/Android.mk
在 LOCAL_SRC_FILES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)
../../Classes/PanZoomLayer.cpp
在 LOCAL_C_INCLUDES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)
$(LOCAL_PATH)/../../Classes
(2)然后配置 frameworks/cocos2d-x/cocos/scripting/lua-bindings/Android.mk文件。
在 LOCAL_SRC_FILES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)
auto/lua_custom_api_auto.cpp
在 LOCAL_C_INCLUDES 參數(shù)的后面添加:(注意后面的 \ ,僅最后一行不加斜杠)
$(LOCAL_PATH)/../../../../runtime-src/Classes
(3)然后 Build-Runtime,將項(xiàng)目在Android端編譯一下。
(4)若編譯成功,就可以在Android手機(jī)上測(cè)試了!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。