设为首页 加入收藏

TOP

C++ 对象的Lua脚本化
2014-11-24 08:10:24 来源: 作者: 【 】 浏览:0
Tags:对象 Lua 脚本

脚本化编程


脚本化编程的最大好处就是简单灵活,另外就是热更新,这在网游中广泛被采用,在网游中,通常采用引擎(c/C++)+脚本(lua/python)的架构,那种SDK性质的代码放在引擎中,这些代码在游戏上线后通常很稳定很少被修改,而真正游戏逻辑的制作就都在脚本层中进行。这样有两个好处:1.脚本层的bug基本不会导致程序的crash,因为是沙盒的。2.对于运行的代码,可以方便的采用热更新修复bug。


C与lua的交互


而如果想在脚本层编写逻辑代码,一个最重要的就是需要将引擎层即C++中的对象、函数、全局变量等等暴露给脚本层来访问,当然有时也要能让C++层能够方便的访问脚本层的全局变量。最近稍微仔细的探索了一下C++与Lua之间交互的知识,稍作总结,分享给需要的人。


在C中可以写代码访问调用lua(函数、变量..),同时也可以在C中写代码让所lua里面能访问c。c和lua的交互通常无外乎就以下这三种情况



1.这种情况C是启动程序,然后调用lua里的变量


2.这种情况C被编成库程序,启动程序是lua(通常是你的lua解释器lua.exe),在lua中可以使用c的变量


3.这种情况C是启动程序,然后调用lua里的变量,然后调用的lua里面又能访问c的变量。



无论以上哪种,情况,做到C和lua交互的代码都是在c中写的,这些代码被称为lua的C API。我们要利用C API做三件事:


1.执行某个LUA脚本


2.获取某个LUA的全局变量


2.将C变量或函数注册成指定的规格,使得在LUA中可以调用注册的那些C变量和函数。



如果能完成者三件事,那么就可以完成上图的所有这些途径。


将C API的常用功能和交互的API以图形化的方法绘制出来:



上图中C和lua通过一个虚拟的栈(全局的还有函数内部局部的)来实现互相的访问。


其中


1.执行某个LUA脚本


2.获取某个LUA的全局变量


2.将C变量或函数注册成指定的规格,使得在LUA中可以调用注册的那些C变量和函数。


这三点都可以在上图中找到相关的实现方法,但是这些方法都是为C写的,对于C++的引擎来说,我们通常想实现一种在脚本层的面向对象的访问,通俗来说,比如C++层有个类C,C有个借口 Get(),我们希望在脚本层可以方便的写出c= newClassC(),c:Get()这样的代码,这就是本文探讨的C++对象的LUa脚本化,这在C++引擎的脚本化编程中非常重要。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++智能指针循环引用解决 下一篇Fedora 17下编译Qt5的MySQL驱动

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·“我用Java 8”已成 (2025-12-26 11:19:54)
·下载 IntelliJ IDEA (2025-12-26 11:19:52)
·Java是什么?(通俗 (2025-12-26 11:19:49)
·雾里看花:真正意义 (2025-12-26 10:54:36)
·C++——模板(超详细 (2025-12-26 10:54:34)