cocos2d-x-lua如何導出自定義類到lua腳本環境


這篇教程是基於你的工程是cocos2d-x-lua的項目,我假設你已經完全駕馭cocos-x/samples/Lua/HelloLua工程,基本明白lua和c++互調的一些原理。

我們的目的是要在lua中使用我們自己定義的類,並且這個類要導出到我們自己的module,意思就是說不是追加到LuaCocos2d.cpp里面,目的是為了使我們的module和coco2d的module完全分離,這樣以后更新cocos2d-x版本時,對我們的module沒影響。

 

1、先在Classes文件夾下創建一個類Test(新創建的,名字都是都是自己定,你可以隨意起,下面不贅述),代碼就簡單點,例如

#ifndef  _TEST_H_
#define  _TEST_H_
 
class  Test
{
public:
    Test();
    ~Test();
  static int foo(){return 10;}
  int do(){return 20;}
};

  

 2、然后在工程目錄創建一個文件夾叫MyLuaModule,和Classes文件夾同級。

 

3、里面創建個文件MyLuaModule.h,把他拖進工程(add to target勾上),寫下一下代碼

#ifndef __MY_LUA_MODULE_H_
#define __MY_LUA_MODULE_H_

extern "C" {
#include "tolua++.h"
#include "tolua_fix.h"
}

#include "Test.h" //你新加的類的頭文件

TOLUA_API int tolua_MyLuaModule_open(lua_State* tolua_S); //這個函數我們只要在這里先聲明就行了,到時候有工具自動給我們生成

#endif // __MY_LUA_MODULE_H_

 

4、到前面創建的MyLuaModule目錄下,創建一個文件叫Test.pkg(這個最好和你新加的類名字一樣),寫這個文件要遵循一些規則:

1) enum keeps the same//枚舉不變

2) remove CC_DLL for the class defines, pay attention to multi inherites//移除掉定義的類的CC_DLL宏(我們自定義的類其實沒有),注意多重繼承
3) remove inline keyword for declaration and implementation//移除inline關鍵字,不管是聲明處還是實踐處
4) remove public protect and private//移除public protect and private
5) remove the decalration of class member variable//移除成員變量
6) keep static keyword//保留static關鍵字
7) remove memeber functions that declared as private or protected//除掉保護的和私有的成員函數

遵循以上7點原則,我們就寫下這些

注意:最好就是把你這個類的頭文件里的全部復制到pkg里,然后移除掉不必要的,剩下就對了

class Test
{
  static int foo();
 int do(){return 20;}
};

  

5、到上面創建的MyLuaModule目錄下,創建一個文件叫MyLuaModule.pkg,寫下一下代碼

$#include "MyLuaModule.h"

$pfile "Test.pkg"

  

這個文件其實是作為一個匯總文件,我們就拿這個去自動生成代碼。
1)第一行的目的是為了下面生成cpp的時候都會包含這個頭文件。
2)第二行是我們的新加的類的描述文件(以后如果有新的類Test1,那就在寫個Test1.pkg,然后再把Test1.pkg加在后面)。

6、我們進入cocos2d的根目錄/tools/tolua++,Mac系統解壓tolua++.Mac.zip,Win系統解壓tolua.rar,把解壓得到的tolua++(可執行文件)拷貝到上面創建的MyLuaModule目錄下
打開命令行終端,cd到MyLuaModule目錄,然后敲 ./tolua++ -o MyLuaModule.cpp MyLuaModule.pkg,把輸出的文件MyLuaModule.cpp文件拽進工程(add to target勾上)
注:win的command不需要加./。我看有的人這樣寫./tolua++ -tCocos2d -o MyLuaModule.cpp MyLuaModule.pkg,-tCocos2d這個參數我真不知道干啥的,誰要是知道,請告訴。-o MyLuaModule.cpp是輸出文件名字

7、現在准備工作都做好了,如果前面沒有問題的話,是能編譯通過的,接下來還有一個重要的步驟,那就是把我們module注入到LuaScriptEngine里。
打開AppDeletegate.cpp,找到CCLuaEngine* pEngine = CCLuaEngine::defaultEngine();這一行,在后面追加一行

tolua_MyLuaClass_open(pEngine->getLuaStack()->getLuaState());同時別忘了include上我們MyLuaModule.h頭文件。

8、測試。新建個lua腳本,里面寫

local test = Test:new()
print("test:do()=",test:do())
print("Test:foo()=",Test:foo())

  

build完運行下看output里的結果把

 

關於./tolua++ -tCocos2d -o MyLuaModule.cpp MyLuaModule.pkg這句話的-tCocos2d參數到底啥意思,請知道的指教下,謝謝了先。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM