版权声明:本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名elloop(包含链接)
自从13年开始做手游接触lua,始终是边写边学,缺乏对lua更加全面系统的学习,这几篇文章开始“重识lua”, 把欠下的帐还回来。这个系列侧重于总结lua作为扩展程序的用法,不会着重介绍lua的语法。
前言
前一篇文章总结了lua中C API的基本用法和常见的虚拟栈操作函数,并没有涉及到具体的lua代码,只有当这些API用来连接lua代码和C++代码的时候,才能发挥出它的最大威力。本文的主题在于使用C++来加载、调用lua代码。
本文使用的Lua版本还是5.1。
C++中加载lua脚本
就像打开其它类型的文件一样,比如打开一个txt文件读取成一个字符串,打开一个json文件用json解析库来解析出感兴趣的字段;对于lua脚本则有lua解析器去解释它,它不仅可以被当做普通的静态配置文件来使用,更牛的地方就在于,它,是可编程的!对,因为它是一门编程语言。尤其是当你为lua打开了它的翅膀(lua标准库)。
下面就给出一个简单的例子,演示一下,如何把lua脚本当做一种资源,载入到C++代码中。
下面这个lua文件里定义了两个全局变量一个是字符串类型的怪物类型,一个是怪物血量,我把它当做一个配置文件来用,在C++中读取它们的值
res/config.lua:
main.cpp:
输出:
可以看到lua这种“配置”文件还是比较方便读取的,不用关心字符和数字等类型的处理细节,丢给lua解释器就行了,它会把值提取出来放到虚拟栈上等我来取, 只是我自己需要心里有数我想要的变量在栈的什么位置,数据类型是什么。这些都可以通过合理的封装做到更加易用和不易出错。
相对于txt, json, xml等配置文件,lua作为配置的优势还在于它拥有计算的能力,比如:
我可以在lua脚本里写一个复杂的公式,以此公式来计算一些血量值。
在C++中读取:
输出:
可以看到,这仅仅是用了lua本身的语法,还没用lua库功能情况下就已经比普通意义上的配置文件牛很多了。(想了想,其实别的编程语言不也是一种配置文件吗,他们是编译器(或解释器)才能解释的配置)
除了上面两个例子读取lua全局变量,lua中的table也很容易被C++读取:
我在lua里添加了一个table,
现在要在C++中读取这个table里的两个字段:
输出:
总结
好了,先说这么多,这篇演示了如何从C++加载lua脚本,并读取变量和表。
API |
功能 |
lua_getglobal(lua_State* lua, const char* key) |
获取key对应的全局变量,它其实是一个宏,详见lua.h |
lua_gettable(lua_State* lua, int table_index) |
获取table的一个字段,需通过table_index 指明table在栈中的索引, key需要提前压入栈中 |
lua_getfield(lua_State* lua, int table_index, const char* key) |
获取table key对应的value, 需通过table_index 指明table在栈中的索引 |
以上三个API操作的结果都会被压入栈中,而不是由函数返回。
下一篇文章总结一下如何从C++调用lua的函数。
在这里也能看到这篇文章:github博客, CSDN博客, 欢迎访问