BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #38986同步于 2010/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

A Simple Lua Bind to C++ Class

FadeToBlack
2010/8/10镜像同步5 回复
自从有了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
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
zxsword机器人#1 · 2010/8/10
只懂C的飘过=。=
wks机器人#2 · 2010/8/10
分不清c和c++的飘过 【 在 zxsword 的大作中提到: 】 : 只懂C的飘过=。= : -- : : ...................
wodetiandi机器人#3 · 2010/8/10
木有用过~~·
kissme机器人#4 · 2010/8/11
随便说几句 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的代码,现在觉得也就那样。公开就公开,没啥了不起的,比我牛的人也不肖去看,而比我菜的人估计也看不懂。话说我这几年没有专门学过什么语言,只是自己做了几个自订项目,学了很多东西,外加平时玩玩游戏,日子很充实。
FadeToBlack机器人#5 · 2010/8/14
这几天看了公司另一个项目写的Lua封装,基于Lua++,感觉很干净,而且灵活性很高(只是 80%的功能都没用到 XD) 看看你的GamePans去 【 在 kissme (kissme) 的大作中提到: 】 : 随便说几句 : 1.Lua 与 C++的结合我已经研究完成了好几年了,成果见sourceforge的GamePans,就是我后来搞单片机的代码时,也能看到Lua的应用。 : 2.脚本或语言这个东西,可以跟兴趣学,也可以跟工作项目走,但不要空学,什么叫空学?就是为了学语言而学语言,没有意义。如果没有项目走,只有兴趣,就一定要提出一个自订项目来,否则发现不了这个语言的特点和适合范围。 : ...................