实现菜单系统的Lua回调函数
2013-12-7 20:16:19
收藏:0
阅读:102
评论:1
在我们的菜单系统中,我们使用 xml 定义菜单,并使用 lua 代码块作为菜单组件事件的回调。目前,每次调用脚本回调时,我们都会调用相当慢的 lua_loadstring。我试图使它只发生一次,即加载菜单时只调用一次。
我的初始想法是针对每个菜单组件维护一个 lua 表,并执行以下操作将新的回调函数添加到该表中:
//create lua code that will assign a function to our table
std::string callback = "temp." + callbackName + " = function (" + params + ")" + luaCode + "end";
//push table onto stack
lua_rawgeti(L, LUA_REGISTRYINDEX, luaTableRef_);
//pop table from stack and set it as value of global "temp"
lua_setglobal(L, "temp");
//push new function onto stack
int error = luaL_loadstring(L, callback.c_str());
if ( error )
{
const char* errorMsg = lua_tostring(L, -1);
Dbg::Printf("error loading the script '%s' : %s\n", callbackName, errorMsg);
lua_pop(L,1);
return;
}
//call the lua code to insert the loaded function into the global temp table
if (lua_pcall(L, 0, 0, 0))
{
Dbg::Printf("luascript: error running the script '%s'\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
//table now has function in it
这似乎有点不太好。是否有更好的方法,允许我直接从 lua 代码块将该函数分配给表,而无需使用临时全局变量和运行 lua_pcall?
原文链接 https://stackoverflow.com/questions/7812801
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
如果你想把函数放在表中,那么就把函数放在表中。看起来你的 Lua-stack-fu 不太行,建议你仔细学习手册中的 内容。
无论如何,我认为你的最大问题是对于
params
的坚持。回调函数应该是可变参数的;它们将...
作为参数。如果它们想要得到这些值,它们应该像这样使用本地变量:local param1, param2 = ...;
但如果你坚持允许它们指定参数列表,你可以这样做:
std::string luaChunk = //这里有一个 ; 而不是 \n,因此代码的行号 //不会因为代码的添加而被破坏。 "local " + params + " = ...; " + luaCode; lua_checkstack(L, 3); lua_rawgeti(L, LUA_REGISTRYINDEX, luaTableRef_); if(lua_isnil(L, -1)) { //如果表不存在,就创建它。 lua_newtable(L); //将其放入注册表。 lua_rawseti(L, LUA_REGISTRYINDEX, luaTableRef_); //获取它并将其弹出,因为设置它会将其弹出。 lua_rawgeti(L, LUA_REGISTRYINDEX, luaTableRef_); } //这个表在栈上。现在把键放在栈上。 lua_pushlstring(L, callbackName.c_str(), callbackName.size()); //加载我们的函数。 int error = luaL_loadbuffer(L, luaChunk.c_str(), luaChunk.size(), callbackName.c_str()); if( error ) { const char* errorMsg = lua_tostring(L, -1); Dbg::Printf("error loading the script '%s' : %s\n", callbackName, errorMsg); //弹出函数名和表。 lua_pop(L, 2); return; } //将函数放在表中。 lua_settable(L, -3); //从栈中删除表。 lua_pop(L, 1);