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裡面呼叫也不需要加字首,直接用類名就行。

相關推薦

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

如何使用cocos的自動繫結工具實現lua呼叫c++的類 主要分成以下步驟 1、建立自己的c++類檔案 2、然後修改和執行引擎資料夾cocos2d-x-3.7\tools\tolua 目錄下的genbindings.py 檔案, 3、編寫自己的ini檔案 4、將生成的繫

Quick-Cocos2dx-Community lualua呼叫C++

這裡有篇文章,看三和四。 按上面操作,檔案都不缺少的,可以直接看  2. 和 3 . 記住:player3 來開啟專案, 的類格式化後,放到他的原始碼路徑下面, 解釋生成的lua 也要放到 api下面 player3  重新生成就可以了 player3    最後開

使用g++命令生成dll檔案實現lua呼叫C程式碼

首先安裝gcc環境,下載MinGW,MinGW只是一個管理工具,真正的環境還需要在裡面下載注意選中下載項後點擊選單項中Installation--->Apply Changes才會開始下載,會下載至MinGw安裝目錄下,確保bin目錄中存在lua52.dll,lua.e

lua——alien庫實現lua呼叫C動態連結庫(dll、so)

我們知道,lua通過lua_State堆疊可以很方便的與C語言進行互動 也可以呼叫專門為lua呼叫而封裝的C庫。 具體步驟: 1.原C檔案中引入lua相關標頭檔案 #include "lua.h" #include "lualib.h" #include "lauxli

ApolloStudio高手之路(6):用Python以極簡方式讀寫OPC DA、OPC UA資料並實現UI控制元件自動重新整理顯示

OPC(OLE for Process Control, 用於過程控制的OLE)是一個工業標準,OPC是為了連線資料來源(OPC伺服器)和資料的使用者(OPC應用程式)之間的軟體介面標準。資料來源可以是PLC,DCS,條形碼讀取器等控制裝置。隨控制系統構成的不同,作為資料來源的OPC伺服器既可以

SpringMVC複雜資料——陣列實現批量刪除

前幾天學習SSM開發框架遇到了批量刪除的資料繫結問題,就從網上學習了一下,參考別人的部落格又加了點自己的見解寫了這篇部落格。 繫結陣列 在實際開發時,可能會遇到前端請求需要傳遞到後臺多個input的Name屬性相同的資料的情況(如批量刪除),這個情況用SpringMVC的Controller

Vue雙向原理實現——觀察者模式

前言 Vue 框架是一種 MVVM 框架,它有一個很大的特點就是資料雙向繫結,在開發過程中我們只需要操作 Model ,而不需要修改 View ,使用起來 VR 因吹斯汀。但是它的實現原理並不複雜,主要是運用了設計模式中的觀察者模式,也可以說是加了鉤子函式。下面用原生 JS 實現一下。

angularjs的雙向原理實現

angularjs的雙向繫結用js程式碼來實現 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>雙向繫結的js實現</title>

遊戲Call技術-主執行緒呼叫CALL技術(反遊戲檢測call)

我們在寫call呼叫遊戲程序裡call時候,經常外掛執行工作一段時間後,遊戲就會斷線或崩潰掉,但是經過檢查, 發現自己呼叫CALL的程式碼又沒發現寫錯誤,這到底是怎麼呢?{:100_162:} 其實這些是現在遊戲的一些遊戲反外掛檢測導致的,並不是我們呼叫call的程式碼沒寫對, 現在的

關於Polymer的雙向實現的探究(更新中)

探究polymer雙向繫結和單向繫結的實現 個人測試github:https://github.com/lufei222/PolymerElements 遇到的問題: 1、雙向繫結的探究從哪裡下手?直接原始碼中搜索[[]]和{{}}? 2、基於原始版的polymer.h

vue 雙向資料實現學習(二)- 監聽器的實現

廢話:上一篇https://www.cnblogs.com/adouwt/p/9928278.html  提到了vue實現的基本實現原理:Object.defineProperty() -資料劫持 和 釋出訂閱者模式(觀察者),下面講的就是資料劫持在程式碼中的具體實現。 1.先看如何呼

vue雙向資料實現

總所周知,偵測一個物件變化的方法,常用的兩種是Object.defineProperty,和es6的proxy,下面就基於Object.defineProperty實現簡單的雙向繫結 其實vue主要是通過Object.defineProperty實現的,至於vue3.0會不會重寫

Retrofit證書實現HTTPS單項認證

客戶端內建伺服器的證書,我們在校驗服務端證書的時候只比對和App內建的證書是否完全相同,如果不同則斷開連線。那麼此時再遭遇中間人攻擊劫持我們的請求時由於黑客伺服器沒有相應的證書,此時HTTPS請求校驗不通過,則無法與黑客的伺服器建立起連線。 那麼接下來我們就結合Retrofit以訪問12306

vue.js和angular雙向資料實現原理

一、vue雙向資料繫結 1、原理 資料劫持: vue.js 是採用資料劫持結合釋出者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在資料變動時釋出訊息給訂閱者,觸發相應的監聽回撥。 2、實現步驟 要實現mv

Kubenetes裡pod和service實現方式

我之前的文章 如何在Kubernetes裡建立一個Nginx service介紹瞭如何建立一個Kubernetes pod和service,使用的方法是命令kubectl run。 本文介紹另一種方式,通過這種方式來學習Kubernetes裡pod和對應的ser

SpringMVC 自動資料

第一種:繁重操作解決方式 不在Controller裡面寫InitBinder方法,直接在實體類裡面將DATE型別的欄位上加註解。 /** * 債務履行起始時間 */ @DateTimeFormat(pattern = "yyyy-MM-dd")

Asp.net MVC Fckeditor的擴充套件(支援PV3及自動)

namespace System.Web.Mvc {     using System;     using System.Globalization;     ///<summary>/// Fckeditor的HTMLHelper     ///http://chsword.cn

js 將json資料自動到 html table 表格中

/*自動繫結到table*/ var f = new Function("+[{id:"1",name:"aa"},{id:"2",name:"bb"}]+"); var list = f(); var h= "<table id='tb'>"; h+= "&l

使用dropdownlist的_實現省市列表級聯

 protected void Page_Load(object sender, EventArgs e)         {             if (!IsPostBack)             {                 string sql = "select * from prov

通用的事件實現

考慮IE相容性 關於IE低版本的相容性處理: IE低版本使用attachEvent繫結事件實現,使用量也比較少,很多網站並不支援。 考慮代理 代理是事件冒泡的一個具體應用 場景:動態隨時新增元素,如一個div下面的多個a標籤; 方法:將事件繫結到父級div上,通過targe