我所理解cocos2d-x 3.6 lua,cocos2d-xlua

來源:互聯網
上載者:User

我所理解cocos2d-x 3.6 lua,cocos2d-xlua
cocos2d-x 2.x 與 cocos2d-x 3.x 差異(tolua++)


    cocos2d-x在2.x版本裡就是用toLua++和.pkg檔案這麼把自己註冊進Lua環境裡的,然而從cocos2d-x 3.x開始,用bindings-generator指令碼代替了toLua++。


    bindings-generator指令碼的工作機制是:
        1、不用編寫.pkg和.h檔案了,直接定義一個ini檔案,註冊到Lua環境裡的模組名是什麼,就行了。
        2、摸清了toLua++工具的產生方法,改由Python指令碼動態分析C++類,自動產生橋接的.h和.cpp代碼,不調用tolua++命令了

        3、雖然不再調用tolua++命令了,但是底層仍然使用toLua++的庫函數,比如tolua_function,bindings-generator指令碼產生的程式碼就跟使用toLua++工具產生的幾乎一樣


    bindings-generator指令碼掌握了產生toLua++橋接代碼的主動權,不僅可以省下大量的.pkg和.h檔案,而且可以更好地插入自訂代碼,達到cocos2d-x環境下的一些特殊目的,比如記憶體回收之類的,所以cocos2d-x從3.x開始放棄了toLua++和.pkg而改用了自己寫的bindings-generator指令碼是非常值得讚賞的聰明做法。

    接下來說怎麼用bindings-generator指令碼:
        1、寫自己的C++類,按照cocos2d-x的規矩,繼承cocos2d::Ref類,以便使用cocos2d-x的記憶體回收機制。
        2、編寫一個.ini檔案,讓bindings-generator可以根據這個設定檔知道C++類該怎麼暴露出來
        3、修改bindings-generator指令碼,讓它去讀取這個.ini檔案
        4、執行bindings-generator指令碼,產生橋接C++類方法
        5、用VS2012將自訂的C++類和產生的橋接檔案加入工程,不然編譯不到
        6、修改AppDelegate.cpp,執行橋接方法,自訂的C++類就註冊進Lua環境裡了。

    首先是自訂的C++類。我習慣將檔案儲存在frameworks/runtime-src/Classes/目錄下:

    frameworks/runtime-src/Classes/MyClass.h

#include "cocos2d.h"using namespace cocos2d;class MyClass : public Ref{public:  MyClass()   {};  ~MyClass()  {};  bool init() { return true; };  CREATE_FUNC(MyClass);  int foo(int i);};
    frameworks/runtime-src/Classes/MyClass.cpp

#include "MyClass.h"int MyClass::foo(int i){  return i + 100;}
    然後編寫.ini檔案。在frameworks/cocos2d-x/tools/tolua/目錄下能看到genbindings.py指令碼和一大堆.ini檔案,這些就是bindings-generator的實際執行環境了。隨便找一個內容比較少的.ini檔案,複製一份,重新命名為MyClass.ini。大部分內容都可以湊合不需要改,這裡僅列出必須要改的重要部分:
    frameworks/cocos2d-x/tools/tolua/MyClass.ini

[MyClass]prefix           = MineClass # 添中首碼名XX,註冊檔案頭及註冊函數名以首碼名(XX)組合命名target_namespace = my # 空間命名,調用時,以my.xxx, xxx為自訂類的方法headers          = %(cocosdir)s/../runtime-src/Classes/MyClass.h    # 擷取自訂類的檔案頭classes          = MyClass                                          # 需要註冊類YY(方法),同時註冊函數名以首碼名(XX)_YY組合命名
    frameworks/cocos2d-x/tools/tolua/genbindings.py
cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \            'MyClass.ini' : ('MyClass', 'lua_MyClass_auto'), \            ...
    (其實這一步本來是可以省略的,只要讓genbindings.py指令碼自動搜尋目前的目錄下的所有ini檔案就行了,不知道將來cocos2d-x團隊會不會這樣最佳化)
至此,產生橋接檔案的準備工作就做好了,執行genbindings.py指令碼:

python genbindings.py
    成功執行genbindings.py指令碼後,會在frameworks/cocos2d-x/cocos/scripting/lua-bindings/auto/目錄下看到新產生的檔案:


        


    註:若python報錯,看下是否缺少yaml、Cheetah包,若是,安裝包就行了。

    簡單解釋下編譯成後lua_MyClass_auto.cpp

TOLUA_API int register_all_MineClass(lua_State* tolua_S){//進入點,它建立管理的內部變數tolua_open(tolua_S);//建立新模組tolua_module(tolua_S,"my",0);//註冊一個模組或類tolua_beginmodule(tolua_S,"my");// 類的註冊lua_register_MineClass_MyClass(tolua_S);tolua_endmodule(tolua_S);return 1;}
    註冊類:

int lua_register_MineClass_MyClass(lua_State* tolua_S){    tolua_usertype(tolua_S,"MyClass"); //註冊使用者類型    tolua_cclass(tolua_S,"MyClass","MyClass","cc.Ref",nullptr); //註冊類    tolua_beginmodule(tolua_S,"MyClass"); //註冊模組        tolua_function(tolua_S,"new",lua_MineClass_MyClass_constructor); //綁定函數(將Lua裡面MyClass對象的”new”綁定到你的lua_MineClass_MyClass_constructor()函數中去.)        tolua_function(tolua_S,"init",lua_MineClass_MyClass_init);        tolua_function(tolua_S,"foo",lua_MineClass_MyClass_foo);        tolua_function(tolua_S,"create", lua_MineClass_MyClass_create);    tolua_endmodule(tolua_S);    std::string typeName = typeid(MyClass).name();//儲存註冊類    g_luaType[typeName] = "MyClass";    g_typeCast["MyClass"] = "MyClass";    return 1;}
    綁定函數,要注意下:

cobj = (MyClass*)tolua_tousertype(tolua_S,1,0);//是將資料棧下的對象以(CTest* )的指標形式彈出來。
    從棧中彈出對象(其實是自定類的對象),接著把對象引用方法(包括含參數及handle)返回結果壓棧,實現c、lua之間互相調用了。


2.編譯運行 

    開啟Classes/lua_module_register.h檔案,添加標頭檔 

#include "tolua++/lua_MyClass_auto.hpp"
    在static int lua_module_register(lua_State* L)添加註冊函數

register_all_MineClass(L);
    若vs2012編譯錯誤,估計都是沒把源檔案及產生的檔案加入工程; 若有特殊處理,比如更換genbindings.py指令碼組建檔案路徑,注意在vs2012環境->屬性->c/c++->附加元件封裝含目錄,添加路徑。

lua代碼:

function myadd(x, y)-- 自訂local test = my.MyClass:create()print("lua bind: " .. test:foo(99))    return x + yend
編譯運行:



引用部落格:http://segmentfault.com/a/1190000000631630

引用文章:http://cn.cocos2d-x.org/tutorial/show?id=2496

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.