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
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
#define
GTC_LP 0x0000
//
指针
#define
GTC_INT 0x0001
//
整型
#define
GTC_DOUBLE 0x0002
//
浮点型
#define
GTC_STRING 0x0003
//
字符串
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
//
脚本数据类型定义
enum
![](https://i-blog.csdnimg.cn/blog_migrate/2f88ce130b654eb5dc6788e02dbcfc90.gif)
{
SD_NUMBER = 0, // 数字类型
SD_STRING, // 字符串类型
SD_TABLE, //表
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
struct
SSDTable
![](https://i-blog.csdnimg.cn/blog_migrate/2f88ce130b654eb5dc6788e02dbcfc90.gif)
{
int nNum;
void* pValue;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
//
脚本参数对象
struct
SScriptParamObj
![](https://i-blog.csdnimg.cn/blog_migrate/2f88ce130b654eb5dc6788e02dbcfc90.gif)
{
int nType; // 参数类型, SD_NUMBER 或者 SD_STRING
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
union UScriptParam // 参数值
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
int nNumber; // 数字
char szString[64]; // 字符串
SSDTable stTable;
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
} unValue;
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
SScriptParamObj()
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
memset(this, 0, sizeof(*this));
}
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
void operator = (int nValue)
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
nType = SD_NUMBER;
unValue.nNumber = nValue;
}
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
void operator = (char *str)
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
nType = SD_STRING;
unValue.szString[0] = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
if (str != NULL)
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
strncpy(unValue.szString, str, sizeof(unValue.szString));
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
void operator = ( SSDTable pT )
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
{
nType = SD_TABLE;
unValue.stTable.nNum = pT.nNum;
unValue.stTable.pValue = (void *)pT.pValue;
}
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
struct
ILuaScript
![](https://i-blog.csdnimg.cn/blog_migrate/2f88ce130b654eb5dc6788e02dbcfc90.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: szFileName - 脚本文件名
* @Return: NULL
* @Description: 调用一个脚本
*/
virtual bool CallFile(const char *szFileName) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: szFuncName - 函数名 pIn, nInNum - 输入参数列表指针以及个数
* @Return: pRet, nRetNum - 返回参数列表指针以及个数
* @Description: 调用一个函数
*/
virtual bool CallFunction(const char *szFuncName, SScriptParamObj *pIn,
int nInNum, SScriptParamObj *pRet, int nRetNum) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: szString - 字符串指针
* @Return: NULL
* @Description: 调用一个字符串
*/
virtual bool CallString(const char *szString) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/df37983f39daa189b8c814e01a6a9011.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void ShowLuaCallStack() = 0;
}
;
![](https://i-blog.csdnimg.cn/blog_migrate/cbef093dcc044b2793832001e2365e43.gif)
struct
ILuaManager
![](https://i-blog.csdnimg.cn/blog_migrate/2f88ce130b654eb5dc6788e02dbcfc90.gif)
{
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual bool InitManager(IGameWorld* pGameWorld) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual ILuaScript* CreateScript() = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void Update(float fElapse) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: 注意如果是自己卸载一个script,请自己
手工管理这个script的指针,manager析构
的时候,会自动析构所有的script
*/
virtual void UnlinkScript(ILuaScript* pScript) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual ILuaScript* GetScript(const char* szScriptName) = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/f70a0fde2b51b7dd92a70e712e540cf6.gif)
/**//*
* @Param: NULL
* @Return: NULL
* @Description: NULL
*/
virtual void Release() = 0;
}
;
#endif
另外,还有一个高手写的binder,针对c++的object做了很好的封装,但我没有采用,因为我想要灵活一点的。
链接在下面,大家可以对比一下,给出评论
http://www.codeproject.com/KB/cpp/luaincpp.aspx
原文地址:
http://www.cppblog.com/zuhd/archive/2010/05/04/114346.html