這篇教程是基於你的工程是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參數到底啥意思,請知道的指教下,謝謝了先。