天天看點

<html>

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>      
&lt;html&gt;

繼續閱讀