1. 程式人生 > >如何使用cocos的自動繫結工具實現lua呼叫c++的類

如何使用cocos的自動繫結工具實現lua呼叫c++的類

如何使用cocos的自動繫結工具實現lua呼叫c++的類

主要分成以下步驟

1、建立自己的c++類檔案

2、然後修改和執行引擎資料夾cocos2d-x-3.7\tools\tolua 目錄下的genbindings.py 檔案,

3、編寫自己的ini檔案

4、將生成的繫結檔案匯入到自己的cocos專案中使用

下面詳細介紹每個步驟的過程

一、建立自己的c++

以下是cocos2d-x-3.7\tests\lua-empty-test\project\Classes\MyClass\MyClasss.h標頭檔案的內容

 

以下是cocos2d-x-3.7\tests\lua-empty-test\project\Classes\MyClass\MyClasss.cpp檔案的內容

 

注意類如果不繼承Ref的話,在專案裡會報這個錯:

錯誤 3 error C2683: dynamic_cast:MyClass”不是多型型別(..\Classes\lua_myclass_auto.cpp)d:\pyq_texas_cocos\texas\frameworks\cocos2d-x\cocos\scripting\lua-bindings\manual\luabasicconversions.h 365 1 texas

點選錯誤發現原因是:cocos2d::Ref*dynObject=dynamic_cast<cocos2d::Ref*>(ret);

Ret這個類會被動態轉換,如果該類不是ret的派生類的話,那麼就會報錯,轉換失敗

二、修改genbindings.py 檔案

在引擎cocos2d-x-3.7\tools\tolua的目錄下,找到genbindings.py檔案,然後我們把genbindings.py 檔案複製一份,然後修改檔名,如改為mygenbindings.py

mygenbindings.py檔案主要修改以下兩個地方

第一個:output_dir = '%s/tests/lua-empty-test/project/Classes/nonamespace' % project_root

這個是修改檔案的輸出目錄,也可以不修改,預設的輸出目錄是output_dir = '%s/cocos/scripting/lua-bindings/auto' % project_root

第二個:cmd_args = {'MyClass.ini' : ('mytestclass', 'lua_myclass_auto')}

這個是用來新增自己的ini檔案,第一個引數是自己的ini檔名,第二個引數要與ini檔案裡面第一行中括號[]的內容相同,在這裡寫成[mytestclass],否則會出現報錯,raise Exception("Section not found in config file")找不到相應的配置檔案。

 

三、修改ini檔案

在引擎cocos2d-x-3.7\tools\tolua的目錄下,有許多ini檔案,這些是cocos自己繫結的類所用到的ini檔案,我們選擇一份內容不是很長的ini檔案,然後複製一份出來,重新命名myclass.ini

myclass.ini檔案主要修改以下幾個地方

第一個:第一行裡面的內容[mytestclass],中括號裡面的內容要與mygenbingdings.py裡面的md_args = {'MyClass.ini' : ('mytestclass', 'lua_myclass_auto')}第二個引數要保持一致

第二個:prefix = mytestclass 修改這個的作用是給註冊檔案頭和註冊函式的命名指定一個字首,比如我生成的註冊函式的函式名是這樣的 int lua_mytestclass_MyClass_myabs(lua_State* tolua_S) 可以看出命名規則是 lua_字首名_類名_類的函式名

然後註冊檔案頭是這樣的 int register_all_mytestclass(lua_State* tolua_S);

第三個:target_namespace = my修改名稱空間,這個的作用是在lua呼叫c++類的時候,增加一個字首,比如要這樣來呼叫my.MyClass  函式要這樣來呼叫my.MyClas:getInstance()MyClass是自己定義的類名。也可以不填,保持為空,那麼呼叫的時候就不需要加字首,直接寫類名就好,如MyClass:getInstance()

第四個:headers = %(cocosdir)s/tests/lua-empty-test/project/Classes/MyClass/MyClass.h獲取自定義類的檔案頭,這個的作用是指定自己類標頭檔案的引用路徑。這個一定要填寫正確,否則也會繫結失敗。比如在這裡,我把MyClass.h標頭檔案放在引擎的這個目錄下tests/lua-empty-test/project/Classes/MyClass/ 當然你也可以放在其他地方,只要路徑正確就行

第五個:classes = MyClass 這個填寫自己的類名就好了

下面附上我的修改圖,紅色為要修改的部分

 

修改好ini檔案和py檔案後,然後執行mygenbindings.py檔案,若python報錯,看下是否缺少yamlCheetah包,若是,安裝包就行了

Yaml包下載 連結:http://pan.baidu.com/s/1geAysIv 密碼:80bg

Cheetah包下載 連結:http://pan.baidu.com/s/1eSvh2Sy 密碼:oatv

要注意的是python的版本要選擇2.7版本,否則yaml有可能安裝不了

如果實在不懂,可以看看官方的說明文件,在cocos2d-x-3.7\tools\tolua 目錄下的README.mdown 文件

執行完畢就會在相應的目錄了看到繫結的檔案啦

如我的是在這個路徑下生成的繫結檔案


我的類檔案放在

 

四、將生成的繫結檔案和類檔案放到專案裡

 

然後編譯檔案,編譯完成後就可以在lua裡面呼叫了

在編譯的時候可能會報  錯誤4 error C2660: luaval_to_int32: 函式不接受 4 個引數d:\pyq_texas_cocos\texas\frameworks\runtime-src\classes\lua_myclass_auto.cpp

原因是生成的繫結函式ok&=luaval_to_int32(tolua_S,2,(int*)&arg0,"MyClass:myabs");

多了一個引數,把"MyClass:myabs"這個去掉就可以了

五、lua呼叫c++自定義類

在編譯成功後,我們就可以在我們的lua專案裡呼叫我們自定義的c++類了,如下結果

 

 

六、有名稱空間的自定義類

在寫自己的自定義類的時候,有時候我們會給自己的類加相應的名稱空間,如:以上面我們的MyClass類為例:

 


在這裡我們加了名稱空間mynamespace,再加了名稱空間後,如果此時立即執行mygenbindings.py,那麼會報如下錯誤    

raise Exception("The namespace (%s) conversion wasn't set in 'ns_map' section of the conversions.yaml" % names Exception: The namespace (mynamespace::MyClass) conversion wasn't set in 'ns_map' section of the conversions.yaml

引起這個錯誤的主要原因是我們的類加了名稱空間後沒有在conversions.yaml這個檔案裡新增我們的名稱空間。於是找到cocos2d-x-3.7\tools\bindings-generator\targets\lua 目錄下的conversions.yaml 檔案,加上我們自己的名稱空間

 

注意加自己的名稱空間的時候,冒號後面的空格不能少,否則會報錯。加好後再重新執行mygenbindings.py檔案。

在這裡要說明一點的是,在自定義類裡面加名稱空間,和前面提到的在ini檔案裡面要修改target_namespace這個欄位,他們之間沒有必然的聯絡。經過我的實驗,如果在自定義類裡面加了名稱空間,而target_namespace 這個欄位為空的話,那麼在lua裡面呼叫也不需要加字首,直接用類名就行。

相關推薦

no