返回信息流自从有了Lua,写代码不需要漫长的编译就能直接使用,而且更新个把系统组件也只需简单
复制粘贴即可,实在是居家旅行杀人放火必备道具。只是Lua和C交互的时候完全是按着预先
定义的函数接口来进行,虽说运行环境可以通过一些全局变量来设置,但却无法胜任多线程
的情况,而且全局指针也会把代码搞得一团糟。
为了把Lua脚本和类实例绑定起来,上网搜啊搜但没看见有什么简单方便的方法,于是自己
想了个解决方案:
做起来很简单,假设有两种类:LuaClass和LuaClassManager。LuaClass的每个实例都有一
个独立的Lua运行环境,LuaClassManager则负责将LuaClass提供的脚本接口以静态函数注
册,并根据脚本来调用不同实例的成员函数。
为了区别不同LuaClass的实例,在每个LuaClass实例的lua_State* m_Lua中设置一个Lua全
局变量作为签名。在LuaClassManager中使用一个map,把每个LuaClass实例和它的签名对应
起来。
简要代码如下:
[code]
class LuaClass :
public IRunnable
{
public:
LuaClass() {}
virtual ~LuaClass() {}
void foo(const string& Msg);
void bar();
void reg_funtbl(const luaL_reg* FunTbl);
int signature();
void signature(int Value);
static const char* sig_str();
virtual void run(void* Param);
private:
LuaVM m_Lua;
static const char* SigStr;
string m_Msg;
};
////////////////////////////////////////////////////
class LuaClassManager
{
public:
virtual ~LuaClassManager(void);
static LuaClassManager* instance();
int create();
bool destroy(int i);
LuaClass* find(int i);
size_t size() const { return m_Container.size(); }
// Lua Interface
static int foo(lua_State* L);
static int bar(lua_State* L);
LUA_FUN_TBL_DECL(FunTbl); // Interface Table Declaration
protected:
LuaClassManager(void);
LuaClass* find(lua_State* L);
private:
typedef map<int, LuaClass*> ContainerType;
ContainerType m_Container;
static LuaClassManager* Instance;
};
///////////////////////////////////////////////////////
// Lua脚本调用示例
int LuaClassManager::foo( lua_State* L )
{
const char* Msg = lua_tostring(L, 1);
LuaClass* A = LuaClassManager::instance()->find(L);
if (A)
{
A->foo(Msg);
}
return 0;
}
[/code]
PS. MS LuaPlus/tolua++/luabind都能实现C++类到Lua的绑定。
PPS. 如果用TLS就更简单了,只不过只能适用于多线程的情况。
PPPS. 也许直接map<lua_State*, LuaClass*>会更简单一些
附件(4.4KB) LuaClassTest.7z
这是一条镜像帖。来源:北邮人论坛 / soft-design / #38986同步于 2010/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
A Simple Lua Bind to C++ Class
FadeToBlack
2010/8/10镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
随便说几句
1.Lua 与 C++的结合我已经研究完成了好几年了,成果见sourceforge的GamePans,就是我后来搞单片机的代码时,也能看到Lua的应用。
2.脚本或语言这个东西,可以跟兴趣学,也可以跟工作项目走,但不要空学,什么叫空学?就是为了学语言而学语言,没有意义。如果没有项目走,只有兴趣,就一定要提出一个自订项目来,否则发现不了这个语言的特点和适合范围。
3.举例说明一下,Lua 与 PY,对比来说,Lua速度很快,快到什么程度,游戏中30FPS的速度,可以用Lua来执行(通俗地讲,就是一秒可以运行一个Lua函数30次),你用PY,基本就不行了,Lua简洁,发布程序,可以只带个dll或so或静态编译,附加大小也就几百K,因为太小了,学习起来也没什么可查的,就那么几个函数倒来倒去,相比之下PY就很夸张了。其实PY很适合做架构脚本,只要实时性要求不高,它能描述一个很复杂的事物。两种脚本没有什么冲突一说,只是看哪个更适合当前的项目罢了。
4.说下我自己,写GamePans时我开始代码是没有公开完的,一两年后,才公开了,首先是没什么人关注,自己藏着意义也不大,其次是几年的成长,写代码多后,人的视野一开,很多东西看法就改变了些,心胸也开旷了很多,一些以前觉得很NB的代码,现在觉得也就那样。公开就公开,没啥了不起的,比我牛的人也不肖去看,而比我菜的人估计也看不懂。话说我这几年没有专门学过什么语言,只是自己做了几个自订项目,学了很多东西,外加平时玩玩游戏,日子很充实。
这几天看了公司另一个项目写的Lua封装,基于Lua++,感觉很干净,而且灵活性很高(只是
80%的功能都没用到 XD)
看看你的GamePans去
【 在 kissme (kissme) 的大作中提到: 】
: 随便说几句
: 1.Lua 与 C++的结合我已经研究完成了好几年了,成果见sourceforge的GamePans,就是我后来搞单片机的代码时,也能看到Lua的应用。
: 2.脚本或语言这个东西,可以跟兴趣学,也可以跟工作项目走,但不要空学,什么叫空学?就是为了学语言而学语言,没有意义。如果没有项目走,只有兴趣,就一定要提出一个自订项目来,否则发现不了这个语言的特点和适合范围。
: ...................