存储脚本

时间:2012-10-01 04:55:02

标签: lua

我正在我的c ++游戏引擎中实现Lua脚本引擎,我想知道存储和执行Lua脚本的最佳方法是什么。我有很多场景节点,每个场景节点都可以分配自己的脚本。调用 lauL_dofile(...)特定脚本的每一帧都是可行的选择,还是有更好的方法?例如,有没有办法存储已经解析过的脚本?我在看 luaL_loadfile lua_pcall 。我以为我会用第一个加载脚本,并在需要时用第二个调用它们,但是lua_pcall似乎没有唯一的id作为参数,所以我该如何知道要执行哪个脚本?

2 个答案:

答案 0 :(得分:1)

如果您要使用Lua API,则需要熟悉Lua堆栈。你可以学到的最重要的事情之一是理解如何阅读the Lua API docs.对于每个函数,右边都有一个关于它如何影响堆栈的符号(如果它完全修改了堆栈)。

luaL_loadfile加载文件并将该文件作为Lua函数推送到堆栈中。 lua_pcall在堆栈上执行一个函数。但它有很多关于它如何做的警告。

通过Lua调用函数的方式就堆栈而言很简单。您按下要调用的功能。然后按顺序从头到尾推送所有参数。然后你发出你对该功能的调用。 lua_pcall以这种方式运作。这意味着要执行的函数的位置总是 nargs + 1,相对于堆栈的顶部,其中nargs是您传递给的函数的参数数量。功能

请注意lua_pcall从堆栈中弹出函数(以及所有参数)。如果您刚刚加载了该文件,那么这将是Lua中该函数的唯一引用。因此,您将无法再次执行该文件。您应该在使用lua_pushvalue to copy it将其参数推送到堆栈之前复制该函数。你可能应该把它放在LUA_REGISTRYINDEX表格中,这样就可以保留它的值。

答案 1 :(得分:0)

正如我评论的那样,您通常在初始化时调用luaL_loadfile。加载的文件通常定义一些[全局]名称(或在某些全局表中填充一些插槽)作为Lua函数。 lua 5.2 documentation给出了如何调用其中一个的示例(§4lua_call)。您可以在应用程序的适当位置执行此类调用(可能使用lua_pcalllua_call),方法是在Lua堆栈上推送适当的内容。