C++ lua表映射到lua文件

标签 c++ lua mapping lua-table

如何将 C++ 中的 lua 表映射到 lua 脚本,其中脚本定义了表的属性和方法,因此生成的 lua 文件类似于:

Script.test = 5

function Script:Update()
end

所以这个脚本可以被多次读取,但每次它都应该在 C++ 中得到它自己的唯一表。

我的想法是从 C++ 调用每个独特的 Update() 方法并能够读取/设置其测试变量。

假设您正在制作视频游戏,我告诉过您,如果您制作这样结构的脚本并将它们附加到模型,游戏将在每一帧运行 Update() 方法,并且您定义的变量是该脚本的本地变量/模型。

最佳答案

这个答案只是为了详细说明我上面的评论。实现您所描述内容的一个简单想法是直接在脚本文件中创建本地表并在末尾返回该表。

local Script = {}

Script.test = 5
Script.foo = "bar"

function Script:Update()
end

return Script

这是将 lua 模块放入其自己的命名空间并避免全局范围污染的常用方法。

您可以像这样从堆栈中获取并使用返回的 Script 表:

// load and execute your script
luaL_dofile(L, "script.lua");

// Run Script:Update()
lua_getfield(L, -1, "Update");
lua_pushvalue(L, -2);
lua_call(L, 1, 0);

您可以将上面的代码片段包装成一个函数,以便更轻松地根据需要多次调用。您甚至可以通过将已编译的 script.lua 缓存在某个地方来提高效率,以避免每次调用此函数时重新解析和重新创建包装函数。例如:

lua_getfield(L, LUA_REGISTRYINDEX, "cached_script");
if (lua_isnil(L, -1))
{
  luaL_loadfile(L, "script.lua");
  lua_pushvalue(L, -1);
  lua_setfield(L, LUA_REGISTRYINDEX, "cached_script");
}
lua_pcall(L, 0, 0, 0);
// etc.

关于C++ lua表映射到lua文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473500/

相关文章:

lua - 使用 lua 进行速率限制

c - Lua 键名或自动索引?

lua - 为什么Lua语言中[[1]]的结果等于 '1'?

c++ - 如何用C/C++语言在Linux/UNIX中查找一个进程的所有读写内存地址?

c++ - 将内存数据 ptr 映射到 qt 输入字段

javascript - 带有非真实世界地图的 Leaflet.js!坐标

c++ - 查找点相对于整个图像的 X 和 Y 坐标

c++ - 准备好的语句可以跨线程共享吗?

c++ - 如何在visual studio中运行linux下编写的程序

c++ - 打开 hdf5 字符串数据集