1, Q:为什么没有用Luaplus或是其他的Binder?
A: nice question! Luaplus不能满足我在linux下使用,其他的太庞大,我需要一个轻量级的。
2,Q:是原创吗?
A:NO, thanks to Matthew Harmon
matt@matthewharmon.com,我按照自己的需求做了封装。
3,Q:它的优点是什么?
A:主要是它简单,基本能满足和C/C++交互的需求。它使用了lua_newthread来管理每一个脚本(性能有问题吗?)。它支持
事件的resume,另外把LuaDebugger也封装进来了,方便调试。
贴下接口头文件:
#ifndef ILUAENGINE_H
#define ILUAENGINE_H
#define GTC_LP 0x0000 // 指针
#define GTC_INT 0x0001 // 整型
#define GTC_DOUBLE 0x0002 // 浮点型
#define GTC_STRING 0x0003 // 字符串
// 脚本数据类型定义
enum
{
SD_NUMBER = 0, // 数字类型
SD_STRING, // 字符串类型
SD_TABLE, //表
};
struct SSDTable
{
int nNum;
void* pValue;
};
// 脚本参数对象
struct SScriptParamObj
{
int nType; // 参数类型, SD_NUMBER 或者 SD_STRING
union UScriptParam // 参数值
{
int nNumber; // 数字
char szString[64]; // 字符串
SSDTable stTable;
} unValue;
SScriptParamObj()
{
memset(this, 0, sizeof(*this));
}
void operator = (int nValue)
{
nType = SD_NUMBER;
unValue.nNumber = nValue;
}
void operator = (char *str)
{
nType = SD_STRING;
unValue.szString[0] = 0;
if (str != NULL)
{
strncpy(unValue.szString, str, sizeof(unValue.szString));
}
}
void operator = ( SSDTable pT )
{
nType = SD_TABLE;
unValue.stTable.nNum = pT.nNum;
unValue.stTable.pValue = (void *)pT.pValue;
}
};
struct ILuaScript
{
/**//*
* @Param: szFileName - 脚本文件名
* @Return: NULL
* @Description: 调用一个脚本
*/
virtual bool CallFile(const char *szFileName) = 0;
/**//*
* @Param: szFuncName - 函数名 pIn, nInNum - 输入参数列表指针以及个数
* @Return: pRet, nRetNum - 返回参数列表指针以及个数
* @Description: 调用一个函数
*/
virtual bool CallFunction(const char *szFuncName, SScriptParamObj *pIn,
int nInNum, SScriptParamObj *pRet, int nRetNum) = 0;
/**//*
* @Param: szString - 字符串指针
* @Return: NULL
* @Description: 调用一个字符串
*/
virtual bool CallString(const char *szString) = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void ShowLuaCallStack() = 0;
};
struct ILuaManager
{
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual bool InitManager(IGameWorld* pGameWorld) = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual ILuaScript* CreateScript() = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void Update(float fElapse) = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: 注意如果是自己卸载一个script,请自己
手工管理这个script的指针,manager析构
的时候,会自动析构所有的script
*/
virtual void UnlinkScript(ILuaScript* pScript) = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual ILuaScript* GetScript(const char* szScriptName) = 0;
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void Release() = 0;
};
#endif
另外,还有一个高手写的binder,针对c++的object做了很好的封装,但我没有采用,因为我想要灵活一点的。
链接在下面,大家可以对比一下,给出评论
http://www.codeproject.com/KB/cpp/luaincpp.aspx本文的下载文件