向绑定到Lua的C++类添加成员函数。
我一直在研究如何将 C++ 类与 Lua 绑定以在游戏引擎中使用,但是遇到一个有趣的问题。我一直在遵循此网站上的教程:http://tinyurl.com/d8wdmea。在教程结束之后,我意识到他建议的以下代码:
local badguy = Monster.create();
badguy.pounce = function(self, howhigh, bonus)
self.jumpbonus = bonus or 2;
self:jump(howhigh);
self:rawr();
end
badguy:pounce(5, 1);
仅会将 pounce 函数添加到特定实例的 Monster 中。所以我将他建议的脚本更改为以下内容:
function Monster:pounce(howhigh, bonus)
print("in pounce function");
print(bonus);
self.jumpbonus = bonus or 2
self:jump(howhigh);
self:rawr();
end
local badguy = Monster.create();
badguy:pounce(5,1);
然而,在调用 pounce 函数时,脚本会中断。经过进一步测试,我唯一能够成功调用 pounce 函数的方法是将函数作为 Monster 类的静态成员调用(函数的代码保持不变):
Monster.pounce(badguy,5,1);
语法上,badguy:pounce(5,1) 是正确的,但是函数没有被正确调用。我是做错了什么,还是这是 Lua 和 C++ 之间绑定的限制/我绑定两种语言的方式的限制?
原文链接 https://stackoverflow.com/questions/8359971
我认为我理解了这个问题,并且可能有解决方案的想法。lua怪物“类”和C++怪物类之间在技术上没有联系。当您在给定的lua对象上调用lua“成员函数”时,它不知道C++中特定的Monster对象。如果您想要调用C++对象的非静态方法,则不能使用lua C函数来完成此操作。您需要在某个地方附加一个userdata,其指针指向C++对象(要非常小心对象的生命周期-您必须使用full-userdata,并使用C函数覆盖lua中的__gc以销毁C++对象)。在这种情况下,您可以在Monster类上声明一个私有静态C++方法,该方法带有这个userdata,并且将指针强制转换并为特定的C++怪物对象调用非静态成员函数及其给定的参数。(我希望我理解了您的问题,并且我的答案足够清楚。)
当你写下面这段代码:
function Monster:pounce(howhigh, bonus)
这是一种快捷方式:
Monster.pounce = function(self, howhigh, bonus)
所以很明显,像你所做的那样调用它:
Monster.pounce(badguy, 5, 1);
是有意义的。
但是你想要做一些不同的事情:从你的 C++ 模块中,你得到了一个名为 Monster
的表。你不想直接操作这个表本身,因为它(只)包含一个名为 create
的项,这是一个“monster”的构造函数。
我必须承认,我没有完全理解你链接到的代码,但是假设一个“monster”的方法是通过元表访问的,那么你可以在那个元表中插入方法 pounce
。
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
无法直接调用您的 C-Object/Function 具有所有参数。您必须将 C 函数注册到 Lua 状态中。这个函数必须看起来像这样:
static int myfunc (lua_State *L) { // your code return X; /* X = number of results */ }
该函数只接收 Lua-State 作为参数。Lua 函数调用的所有参数都在 Lua 堆栈中。您必须从堆栈中弹出它们并使用 C++ 方法进行调用。
函数的注册非常简单,只需要两行代码:
lua_pushcfunction(l, myfunc); lua_setglobal(l, "myfuncnameinlua");
您可以在 " Lua 编程" 书籍的这一章中找到更多关于此的信息。
您想要做的事情,即实现 Lua-Object,有点更加复杂,因为您必须注册元表以创建 Lua 对象,但您的 Lua 到 C 接口仍然是上述函数的类型。
您还可以在 Roberto Ierusalimschy 的书籍的第 28 章中学习实现 Lua-Object。
希望这能帮助您。