1:依照\frameworks\cocos2d-x\tools\tolua下的README.mdown的訓示一步一步做下去。務必要和檔案裡描寫叙述的一樣,我已經被這個坑爹的東西坑的非常慘了。(檢查這個有沒有配置好的方法是:執行下那個genbindings.py,看能否生成liblua的auto檔案夾下的那些檔案。假設能。那麼你的環境配置就成功了。)
2:寫一個自己定義的C++類
樣例:
<span style="font-family:KaiTi_GB2312;font-size:14px;">#pragma once
#include "cocos2d.h"
USING_NS_CC;
class MyClass : public Ref
{
public:
MyClass(void);
~MyClass(void);
bool init() { return true; };
CREATE_FUNC(MyClass);
int foo(int i);
};
</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;">#include "MyClass.h"
MyClass::MyClass(void)
{
}
MyClass::~MyClass(void)
{
}
int MyClass::foo(int i)
{
return i + 100;
}
</span>
3:在\frameworks\cocos2d-x\tools\tolua檔案夾下 能夠看到非常多.ini檔案和一個genbindings.python檔案。
随便拷貝一個.ini檔案,我重命名:myclass.ini。複制一份python檔案,重命名為:mygenbindings.python。
改動兩個配置檔案:
python檔案須要做的改動:
<span style="font-family:KaiTi_GB2312;font-size:14px;"> cmd_args = {'cocos2dx.ini' : ('cocos2d-x', 'lua_cocos2dx_auto'), \
'cocos2dx_extension.ini' : ('cocos2dx_extension', 'lua_cocos2dx_extension_auto'), \
'cocos2dx_ui.ini' : ('cocos2dx_ui', 'lua_cocos2dx_ui_auto'), \
'cocos2dx_studio.ini' : ('cocos2dx_studio', 'lua_cocos2dx_studio_auto'), \
'cocos2dx_spine.ini' : ('cocos2dx_spine', 'lua_cocos2dx_spine_auto'), \
'cocos2dx_physics.ini' : ('cocos2dx_physics', 'lua_cocos2dx_physics_auto'), \
'cocos2dx_experimental_video.ini' : ('cocos2dx_experimental_video', 'lua_cocos2dx_experimental_video_auto'), \
'cocos2dx_experimental.ini' : ('cocos2dx_experimental', 'lua_cocos2dx_experimental_auto'), \
'cocos2dx_controller.ini' : ('cocos2dx_controller', 'lua_cocos2dx_controller_auto'), \
}</span>
變成:
<span style="font-family:KaiTi_GB2312;font-size:14px;">cmd_args = {
'myclass.ini' : ('myclass', 'lua_myclass_auto'), \
}</span>
改動myclass.ini檔案:
[myclass](非常重要。要和檔案名稱一樣。
我被這個坑了非常久)。這個是第一行
prefix = myclass
target_namespace = (我的沒有命名空間)
headers = %(cocosdir)s/../runtime-src/Classes/MyClass.h(這是我的類路徑,和AppDelegate在一起。依據你自己的路徑配置吧)
classes = MyClass
後面的skip = ,rename_functions = 等等都變成空的。
這樣就能夠生成lua和cocos中間檔案了。就像lua_cocos2dx_auto.cpp和hpp那樣。因為我們在python檔案裡沒有改變中間檔案的生成路徑,是以應該和lua_cocosdx_auto在同一個檔案夾下。
将我們自己定義的類進行注冊,在AppDelegate.cpp檔案裡增加一下代碼:
<span style="font-family:KaiTi_GB2312;font-size:14px;">auto engine = LuaEngine::getInstance();
register_all_myclass(engine->getLuaStack()->getLuaState());//在這裡增加這行代碼</span>
這樣就對我們的自己定義類進行了注冊。
對項目進行編譯。發現會報錯:
<pre name="code" class="html"><span style="font-family:KaiTi_GB2312;font-size:14px;">"int __cdecl register_all_myclass(struct lua_State *)" (?register_all_myclass@@YAHPAUlua_State@@@Z),該符号在函數 "public: virtual bool __thiscall AppDelegate::applicationDidFinishLaunching(void)" (?applicationDidFinishLaunching@AppDelegate@@UAE_NXZ) 中被引用</span>
解決的方法:将剛才生成的兩個檔案增加到liblua項目中去,又一次生成liblua項目。搞定啦!!
4:在lua代碼中調用我們的類吧。
在hello2.lua 的main()中增加:
<span style="font-family:KaiTi_GB2312;font-size:14px;">local test = MyClass:create()
print("the first cocos bind lua result "..test:foo(2))</span>