将C++方法和变量绑定到表格中,同时显示。
2013-4-19 22:8:25
收藏:0
阅读:122
评论:1
我一直在试图创建一个“主机”应用程序,将C++ API暴露给Lua代码,并且到目前为止取得了相当大的成功,但是当尝试将“变量”与方法绑定时遇到了一些问题。
我开发的将“类”绑定到lua的模式涉及每个类都有一个_new和_gc函数,以及每个类的静态luaL_Reg RegData[]。然后,我可以将所需的函数分配给RegData数组,并调用帮助方法将它们绑定到lua。以下是演示我的方法的一些代码:
int Host :: _new(lua_State * ls)
{
Host ** udata = (Host **) lua_newuserdata(ls, sizeof(Host *);
* udata = new Host();
luaL_getmetatable(ls,“luaL_Host);
lua_setmetatable(ls,-2);
返回1;
}
int Host :: _gc(lua_State * ls)
{
Host * host = *(Host **)luaL_checkudata(ls,1,“luaL_Host”);
删除主机;
返回0;
}
const luaL_Reg Host :: RegistrationData [] =
{
{“new”,Host :: _new},
{“__gc”,Host :: _gc},
{0,0}
};
在其他地方:
void LuaState :: registerObject(const char * name,const luaL_Reg data [])
{
int len = strlen(name)+ 6;
char * luaLname = new char [len];
snprintf(luaLname,len,“luaL_%s”,名称);
//使用正确的函数创建元表
luaL_newmetatable(_state,luaLname);
luaL_setfuncs(_state,data,0);
//在堆栈上复制元表
lua_pushvalue(_state,-1);
//将索引分配给副本
lua_setfield(_state,-1,“__index”);
//将表暴露为全局“Host”
lua_setglobal(_state,name);
删除luaLname;
}
假设我希望我的Lua代码也能查看键盘状态,并且希望Lua代码访问它如下所示:
host = Host.new()
pressed = host.Keyboard.getKeyPressed(1)
复制完全相同的模式,以建立键盘表是很容易的,但是我似乎找不到一个好的方法将该键盘表添加到我的主机表中。有没有简单的方法在不破坏我的模式的情况下这么做?有没有更好的模式应该使用?
我发现了许多关于如何创建各种不同方面的C-Lua API的资源,但是在执行此操作时没有找到太多有关模式/最佳实践的东西。此外,我知道有一些库,例如LuaBind,可以帮助解决此问题,但是宁愿自己制作(至少第一次)。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

我决定采取更多面向对象/继承的方法来解决这个问题,并计划查看 MOAI SDK 如何实现他们的 Lua API,目前看起来很有前途。