天天看點

三、cocos是如何将c++類導出到lua的?

cocos使用tolua++将c++類暴露給lua,下面是tolua++的使用介紹。

tolua++的工作原理!

1、tolua++是使用c語言、利用lua提供的的c api編寫的一個程式,這個程式解析一個聲明了需要導出的類的文本檔案,生成一個C++代碼檔案。

2、我們将生成的代碼檔案加入到自己的工程中,并調用其中的一個接口函數,就可以将我們定義的類暴露給lua了!

如何使用tolua++!

1、編譯tolua++,得到tolua.exe和靜态庫tolua.lib

2、定義我們需要導出的類test.cpp和test.h,并編寫一個main函數

3、使用tolua.exe,根據test.h生成一個c++代碼檔案

4、在工程中包含這個代碼檔案,并在程式中調用其中的接口函數

詳細的步驟!

1、下載下傳tolua++,安裝相應版本的lua

2、打開tolua++裡面win32檔案夾,用vs打開裡面的sln

3、配置工程的.h和.lib包含目錄,以包含lua

4、編譯生成tolua.exe

5、建立一個靜态庫工程

6、将tolua根目錄裡面的src/lib裡面的代碼檔案添加到工程

7、添加lua的lib,配置以便找到lua的頭檔案

8、編譯生成tolua.lib

9、建立一個測試工程,包含的檔案有:

main.cpp

// 包含pkg檔案生成的tolua.cpp檔案需要的tolua代碼!
#pragma comment(lib,"libproject.lib")
// 包含需要的lua代碼用來解析lua檔案!
#pragma comment(lib,"lua5.1.lib")

// 下面是一個正常的包含lua的程式!
#include <iostream>
using namespace std;

extern "C"
{
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}

// 這個函數在tolua.cpp中實作的,但是tolua沒有生成相應的頭檔案,我們需要自己申明一下!
// 這個函數完成了将cpp類暴露給lua!
int tolua_cpp_open(lua_State*);

int main()
{
	lua_State* L = lua_open();
	luaL_openlibs(L);
	
	// 暴露pkg中定義的類到lua!
	tolua_cpp_open(L);

	luaL_dofile(L, "test.lua");
	lua_close(L);
	return 0;
}
           

test.cpp

#include "test.h"
#include <iostream>

void my_class::greet( char * _str,int _cnt)
{
	for( int i = 0; i < _cnt; ++ i){
		std::cout << _str << std::endl;
	}
}
my_class::my_class(){}
my_class::~my_class(){}
           

test.h

class my_class
{
public:
	my_class();
	~my_class();
    void greet(char*,int);
};
           

tolua_wrapper.cpp

/*
tolua生成的檔案沒有包含test.h,如果我們直接修改生成的tolua.cpp,
則每次重新生成都需要進行修改,而且vs還會提醒重新載入,很麻煩,是以用這
個cpp檔案包裝一下生成的tolua.cpp!
*/
#include "test.h"
// 這是tolua生成的cpp檔案,裡面有一個函數可以将pkg裡面的類導出到lua中!
#include "tolua.cpp"
           

10、在測試工程的源碼目錄建立test.pkg檔案

class my_class
{
public:
	my_class();
	~my_class();
    void greet(char*,int);
};
           

11、建立tolua.bat檔案,當然你需要保證可以找到你的tolua.exe

tolua.exe -n cpp -o tolua.cpp test.pkg
           

tolua生成的接口函數名稱和-n有關,如果是XXX,則接口函數為tolua_XXX_open

-o是輸出檔案名,随意;最後是輸入檔案名

12、運作tolua.bat生成tolua.cpp

13、編寫測試用的lua腳本檔案test.lua

local t = my_class()
t:greet( ":)", 3)
           

你應該看到lua列印出了三個笑臉!

你可以下載下傳測試工程:

http://pan.baidu.com/s/1eQrFafg