tolua++绑定C/C++语言函数供lua调用

1,C/C++提供给lua的接口写在ScriptAPI_*.h和ScriptAPI_*.cpp中(根据模块可以分为多个文件)。为简化问题,要求接口参数为简单数据类型(number、string),且全部为入参,返回值只有一个,类型为int,一般表示错误码。

2,如果需要的话,可以在ScriptAPI.pkg中嵌入lua代码,这些代码在调用生成的绑定接口tolua_pkgname_open时执行。

3,执行ScriptAPIBind.bat脚本(内容如下)生成接口绑定代码文件ScriptAPIBind.h(生成这一个文件即可)。

4,在程序中调用tolua_ pkgname_open(或luaopen_pkgname)进行接口注册,其中会执行“2”中嵌入的lua代码。注意编译时要链接到tolua++.lib。

 

/* ScriptAPI_Pet.h */ // 注意文件命名格式:ScriptAPI_modulename.h

#ifndef ScriptAPI_Pet_H_

#define ScriptAPI_Pet_H_

 

// tolua_begin

// 绑定常量

namespace pet_prop // 支持namespace

{

   enum EPropIdx // 在lua中使用pet_prop.PROP_GENDER

    {

       PROP_MIN = 0,

       PROP_CID,

       PROP_TYPE,

       PROP_GENDER,

       PROP_QUALITY,

       PROP_GENERATION,

       PROP_LV,

       PROP_LIFE,

       PROP_PHY,

       PROP_EXP,

       PROP_MAX

   };

   

   // 绑定全局变量

   const char* PropNameTable[PROP_MAX]; // 注意lua中数组下标是从1开始的。在lua中使用pet_prop.PropNameTable[idx]

}

 

int C_Pet_AddPet(int actorFID, int petID,int taskID); // 接口名以C_modulename_开头。非只读接口要传入taskid,记录日志使用

int C_Pet_DelPet(int actorFID, int petFID,int taskID);

// tolua_end

 

#endif /* ScriptAPI_Pet_H_ */

 

/* ScriptAPI_Pet.cpp */

#include "ScriptAPI_Pet.h"

 

namespace pet_prop

{

   const char* PropNameTable[PROP_PET_MAX] =

    {

       "",

       "ID",

       "类型",

       "性别",

       "品质",

       "代数",

       "等级",

       "寿命",

       "体力",

       "经验",

       ""

   };

}

 

int C_Pet_AddPet(int actorFID, int petID,int taskID)

{

   return 0;

}

 

int C_Pet_DelPet(int actorFID, int petFID,int taskID)

{

   return 0;

}

 

/* ScriptAPI_Fmt.h */

#ifndef ScriptAPI_Fmt_H_

#define ScriptAPI_Fmt_H_

 

// tolua_begin

int C_Fmt_GetDefaultFmt(int actorFID);

const char* C_Fmt_GetFmtName(int fmtID, intfmtLv);

int C_Fmt_CreateXXTrigger(int actorID, inttaskID, const char* callback); // callback是回调的lua接口名

// tolua_end

 

#endif /* ScriptAPI_Fmt_H_ */

 

/* ScriptAPI_Fmt.cpp */

#include "ScriptAPI_Fmt.h"

 

int C_Fmt_GetDefaultFmt(int actorFID)

{

   return 1;

}

 

const char* C_Fmt_GetFmtName(int fmtID, intfmtLv)

{

   return "";

}

 

int C_Fmt_CreateXXTrigger(int actorID, inttaskID, const char* callback)

{

   return 1;

}

 

/* ScriptAPI.pkg */

$hfile "ScriptAPI_Pet.h"

$hfile "ScriptAPI_Fmt.h"

 

$[

-- 嵌入的lua代码

function add(a, b)

   return (a + b)

end

$]

 

/* ScriptAPIBind.bat */

::tolua -S -n pkgname -o myfile.cmyfile.pkg [-S 关闭对string类型的支持 -n指定pkg名–o 指定输出文件名]

tolua++.exe -S -n ScriptAPI -oScriptAPIBind.h ScriptAPI.pkg

pause

 

在C/C++中调用生成的绑定文件中的TOLUA_API int tolua_ScriptAPI_open (lua_State* tolua_S)函数即可,其中进行导出函数的注册以及执行嵌入的lua代码。


你可能感兴趣的:(c,String,lua,语言,callback,generation)