print("Hello from Lua")
print("Lua code is capable of reading the value set from C++", cppvar)
luavar = cppvar * 3
function myluafunction(times)
return string.rep("(-)", times)
end
function myfunction(arg)
return cppfunction(arg)
end
运行 cpp 文件,结果如下:
>> 载入(可选)标准库,以便使用打印功能
>> 载入文件,暂不执行
>> 从 C++ 写入数据 cppvar
>> 执行 lua 文件
Hello from Lua
Lua code is capable of reading the value set from C++ 1.1
>> 从 Lua 读取全局变量 luavar 到 C++
C++ 从 Lua 读取到的 luavar = 3.3
>> 从 C++ 执行 Lua 的方法 myfunction
函数返回值是:(-)(-)(-)(-)(-)
>> 从 Lua 执行 C++ 的方法
>>>> 首先在 Lua 中注册 C++ 方法
>>>> 调用 Lua 函数以执行 C++ 函数
函数返回值是:2.5
>> 释放 Lua 资源
引言
Lua 是一门脚本语言,它有着一个重要的特性就是:它很容易嵌入其它语言。现在,越来越多的 C++ 服务器和客户端融入了脚本的支持,尤其在网游领域,脚本语言已经渗透到了方方面面,比如你可以在你的客户端增加一个脚本,这个脚本将会帮你在界面上显示新的数据,亦或帮你完成某些任务,亦或帮你查看别的玩家或者 NPC 的状态。对于游戏测试来说,大量繁杂的工作都可以由 Lua 代劳,因此在测试领域它也是一把利器。
关于 Lua 的一些重要基础知识:
首先、编译 Lua
首先下载 Lua,一般情况下,很容易就可以通过 make macosx 或者 make linux 来编译。这样会生成 liblua.a 静态库文件,我们随后要连接这个库。
其次、准备环境
首先,我们要在开发工具中连接 liblua.a,然后要将 Lua 源代码文件的位置添加到编译器的头文件搜索目录列表里面去,这样我们的编译器才能找到 Lua 的头文件。
然后、创建程序
我们需要创建一个 C++ 的主程序,以便同 Lua 进行通信。
cpp 程序如下:
其次,是 lua 文件,我们将它命名为 luascript.lua
运行 cpp 文件,结果如下:
代码分析
1. 初始化
上述代码创建 lua_State 并载入标准库,同时载入代码 luascript.lua
2. 从 C++ 向 Lua 添加变量
在 C++ 中通过 lua_setglobal 在 Lua 中设置一个全局变量 cppvar。因为 C++ 和 Lua 通过 lua_State 中的堆栈来交换数据,所以要先 push 数据到堆栈,然后调用 lua_setglobal,这样就将数据赋给相应的值。
设置完全局的 cppvar 之后,执行 lua_pcall 来运行我们的 Lua 代码文件,之后,Lua 就可以使用 cppvar 变量。在 Lua 代码中,还创建了新的全局变量 luavar 可以供 C++ 访问。
3. 从 C++ 中读取 Lua 变量
要从 Lua 中读取数据,我们先要使用 lua_getglobal 将数据放到栈顶,然后将栈顶数据通过 lua_tonumber 转为 double,然后通过 lua_pop 将其移除出栈顶。
4. 从 C++ 中调用 Lua 函数
由了前面的过程,这个比较容易理解了:首先我们通过 lua_getglobal 取得方法名称,即将其放到栈顶,然后通过 lua_pushnumber 给参数赋值,然后通过 lua_pcall 执行。
执行之后,再去栈顶获取返回结果,然后 lua_pop 将其移除。
5. 从 Lua 中调用 C++ 函数
这一段先是使用 lua_pushcfunction 来将 C++ 的方法 l_cppfunction 传递给 Lua,然后通过 lua_setglobal 给予其在 Lua 中的方法名称 cppfunction,接下来执行就很简单了。
6. 释放
以上就是一个简单的 Lua 与 C++ 交互的简单例子,算是入门的基础吧。我们可以看到,C++ 和 Lua 能够很自由的进行通信,而我们也可以很方便的修改 Lua 文件代码来实现对 C++ 程序流程的直接控制,对游戏开发、调试有很大的好处。