【嘮叨】 python
本節要講的是若是將本身寫的C++類註冊進Lua環境,讓Lua去調用自定義的C++類。 android
網上有不少都是用原始的tolua++工具來註冊C++類的,我看了不少這樣的教程,感受操做起來十分麻煩,並且也很難看懂他們到底在講什麼。 git
其實,在cocos2dx v3.2版本中,提供了bindings-generator腳原本封裝toLua++的用法,從而節省了工做量。 github
【致謝】 segmentfault
http://segmentfault.com/blog/hongliang/1190000000718145 (講得很是好!) windows
【使用工具】 eclipse
Windows7 x64 ide
Cocos2dx v3.2 函數
Cocos Code IDE 1.0.1 (支持自定義類的智能提示功能)
python 2.7.x(v3.2版本不必定要2.7.3,我用2.7.8也成功了的)
NDK r9d ,解壓並配置環境變量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下可能在執行腳本時有這個錯誤。
解壓到一某個目錄下面, 並設置PATH環境變量的值指向bin目錄下。
http://waterlan.home.xs4all.nl/dos2unix/dos2unix-7.1-win32.zip
【綁定方法】
如下介紹的是在 Windows7 + VS2013 + Cocos Code IDE。
並使用Cocos Code IDE建立的Lua項目,綁定方法。
一、將自定義的C++代碼放在 frameworks\runtime-src\Classes 下
固然放哪裏是隨意的,我喜歡放在Classes下。
二、添加自定義類的.ini文件
在 frameworks\cocos2d-x\tools\tolua 中,複製一份該文件夾下cocos2dx.ini的配置信息,而後修改一些參數,改爲咱們自定義類的參數。
如下列出須要修改的參數配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[custom_api]
# prefix會被添加到生成的函數.你也能夠選擇不添加這個到你的模板
prefix = custom_api
# 全部的類都會嵌入到這個命名空間
target_namespace = my
# 類所在的路徑,若是有多個,用空格隔開
headers = %(cocosdir)s/../runtime-src/Classes/PanZoomLayer.h
# 須要註冊的類,若是有多個,用空格隔開
classes = PanZoomLayer
# 不提供給Lua的public成員函數
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
|
三、genbindings.py 添加自定義的配置.ini
在 frameworks\cocos2d-x\tools\tolua 的 genbindings.py 中的129行找到 cmd_args 。
將咱們自定義的 custom_api.ini 添加進去,並註釋掉其餘.ini(這些已經不須要從新生成)
四、運行 genbindings.py 腳本
在終端運行 genbindings.py 腳本。
在這裏,我是直接寫了一個批處理文件 .bat 。
注意:只要須要用到的工具都下載,安裝,配置好了,通常就能生成成功。
生成失敗的,基本都是由於工具沒有配置好。
生成成功後,在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto 中會找到咱們生成的C++的橋接文件, lua_custom_api_auto.cpp 和 lua_custom_api_auto.hpp 。
其中 lua_custom_api_auto.hpp 中的 register_all_custom_api 就是咱們用來將PanZoomLayer類註冊到Lua環境中的關鍵函數。
以及在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中也可以找到咱們提供給Lua調用的接口文件。
五、編譯註冊到Lua
註冊自定義類的函數在咱們的 lua_custom_api_auto.hpp 中能夠看到。
register_all_custom_api(lua_State* tolua_S)
使用 VS2013 打開 frameworks\runtime-src\proj.win32 下的工程。
(1)將自定義的類 PanZoomLayer 添加到項目工程的Classes下。
(2)將 lua_custom_api_auto.cpp、lua_custom_api_auto.hpp 添加到工程liblua的auto下。
(3)添加lualib工程的文件搜索路徑。
將 $(EngineRoot)../runtime-src/Classes 路徑加進去。
(4)編輯 frameworks\runtime-src\Classes 下的入口類 AppDelegate.cpp
> 添加:lua_custom_api_auto.hpp 頭文件
> 註冊:register_all_custom_api(state)
> 注意:register_all_custom_api 的上下兩句話,必須加上!
(5)編譯運行整個項目,完成C++類的註冊到Lua。
而後就能夠再Lua中愉快的使用自定義的類了!
【開啓智能提示】
雖然咱們將咱們自定義的C++類註冊到了Lua中調用,可是在Cocos Code IDE中卻沒有咱們自定義類的智能提示。
咱們須要修改一些配置,讓Cocos Code IDE加上對咱們自定義類的智能提示。
一、Cocos2dx引擎中的智能提示
首先咱們來看一下Cocos Code IDE中cocos2dx引擎的智能提示是怎麼搞的。
隨便找個 cc.Label 把!
咱們按住鍵盤的 ctrl 鍵,而後點擊 cc 和 Label,就會跳轉到聲明它們的地方。
文件跳轉到了以下兩幅圖的地方:
可能看到以上兩幅圖,你就明白應該怎麼給咱們自定義的C++類加上智能提示了吧?
咱們先找到如下文件路徑:(可能每一個人的不同)
\CocosCodeIDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2
能夠發現該路徑下有一個 api.zip 這個壓縮包。
咱們將其 api.zip 解壓出來看看裏面都是什麼東西。
能夠發現裏面全是cocos2dx的C++類提供給Lua的接口聲明。
這些也就是IDE中智能提示的緣由。
二、添加自定義類的智能提示(方式一)
咱們仿照 api.zip 中的 cc.lua 和 label.lua 來寫一個自定義類的接口聲明。
> my.lua :聲明命名空間
> PanZoomLayer.lua :聲明自定義類。(這個在使用腳本綁定時,自動生成)
其中 PanZoomLayer.lua 在使用 genbindings.py 腳本時,就自動生成了的。
就在 frameworks\cocos2d-x\cocos\scripting\lua-bindings\auto\api 中。
那麼,咱們再寫一個 my.lua ,也放在這個目錄下好了。
其中,my.lua 代碼以下:
1
2
3
4
5
6
7
8
9
|
--------------------------------
-- @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 中好了。
而後咱們打開Cocos Code IDE的工程項目,配置屬性。
Lua->Build Path->Libraries->Add External Zips。
將咱們的 myapi.zip 壓縮包添加進去,點擊「肯定」。
這樣,就能夠在 Cocos Code IDE 中愉快的玩咱們自定義的類了。
有智能提示,就是爽啊!!!
三、添加智能提示(方式二)
經過上面的方式一的方法雖然能夠有智能提示,但是後來我發現定義的命名空間 my 卻沒法識別。這樣的結果將致使建立的 my.PanZoomLayer:create() 賦值給 self 的成員 self.pzLayer 後,繼續使用 self.pzLayer 時,對應的函數又沒法提示了。
因此這裏咱們經過修改官方智能提示包 api.zip ,來達到更加的智能提示的效果。
操做方法和方式一相似,咱們先將官方的提示包 api.zip 解壓出來,最好將其備份一份。
文件在:
\Cocos Code IDE\configuration\org.eclipse.osgi\bundles\61\1\.cp\resource\cocos2dx-3.2
而後咱們將咱們自定義提示包 my.lua 和 PanZoomLayer.lua 放入 api 文件夾中。
而後在 api 文件夾中找到 global.lua 這個全局聲明文件。
將咱們自定義的命名空間 my 聲明進去。
1
2
|
-- the my module
-- @field [parent=#global] my#my my preloaded module
|
保存關閉,將 api 文件夾壓縮成 api.zip 包。
而後刷新咱們的項目工程,而後再來試試咱們自定義類的智能提示效果。
能夠發現,自定義的類的智能提示已經和 官方的智能提示功能 徹底一致了。
又能夠愉快的玩耍啦!!!
【遇到的問題】
一、腳本生成出錯
這些出錯都是因爲沒有配置 pyyaml、Cheetah、dos2unix 引發的,都下過來配置一下便可。
二、編譯到Android手機出錯
上面的配置完成後IOS的部分是能夠正常運行的,可是這個時候編譯android時不經過的。
由於 AppDelegate.cpp 裏面調用的 register_all_MyClass(L) 方法在android不存在,android的項目裏並無配置去編譯對應的 PanZoomLayer.cpp 文件和後續生成的 lua_custom_api_auto.cpp。
因此須要在android端配置Android.mk文件,讓項目編譯時去編譯這兩個C++文件才行。
(1)首先配置JNI下面的Android.mk文件,讓JNI部分編譯時去編譯PanZoomLayer.cpp:
編輯 frameworks/runtime-src/proj.android/jni/Android.mk
在 LOCAL_SRC_FILES 參數的後面添加:(注意後面的 \ ,僅最後一行不加斜槓)
../../Classes/PanZoomLayer.cpp
在 LOCAL_C_INCLUDES 參數的後面添加:(注意後面的 \ ,僅最後一行不加斜槓)
$(LOCAL_PATH)/../../Classes
(2)而後配置 frameworks/cocos2d-x/cocos/scripting/lua-bindings/Android.mk文件。
在 LOCAL_SRC_FILES 參數的後面添加:(注意後面的 \ ,僅最後一行不加斜槓)
auto/lua_custom_api_auto.cpp
在 LOCAL_C_INCLUDES 參數的後面添加:(注意後面的 \ ,僅最後一行不加斜槓)
$(LOCAL_PATH)/../../../../runtime-src/Classes
(3)而後 Build-Runtime,將項目在Android端編譯一下。
(4)若編譯成功,就能夠在Android手機上測試了!