我一直在研究如何将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 ++之间绑定的限制/我如何绑定这两种语言?
答案 0 :(得分:0)
我认为我理解这个问题,并且可能对解决方案有所了解。从技术上讲,lua Monster'class'和C ++ Monster类之间没有联系。当你在给定的lua对象上调用lua'成员函数'时,它不知道C ++中特定的Monster对象。如果要调用C ++对象的非静态方法,则不能使用lua C函数来执行此操作。你需要在你的lua对象上附加一个用户数据,它有一个指向C ++对象的指针(要非常小心对象的生命周期 - 你必须使用full-userdata并使用C函数覆盖lua中的__gc) C ++对象)。在这种情况下,您可以在Monster类上声明一个需要此userdata的私有静态C ++方法,然后使用给定的参数转换指针并为此特定C ++怪物对象调用非静态成员函数。 (我希望我理解你的问题,我的答案写得非常清楚。)
答案 1 :(得分:0)
写作时
function Monster:pounce(howhigh, bonus)
这是
的快捷方式Monster.pounce = function(self, howhigh, bonus)
显然是通过
来调用它Monster.pounce(badguy, 5, 1);
正如你所做的那样。
但是你想要做一些不同的事情:从C ++模块中你得到一个名为Monster
的表。您不希望操纵此表本身,因为它(仅?)包含名为create
的条目,monster
的构造函数。
我必须承认我没有完全获得你链接的代码,但假设某个怪物的方法被metatable访问,你可以在该metatable中插入方法pounce
。
答案 2 :(得分:-3)
无法直接使用其所有参数调用C-Object / Function。你必须在你的Lua-State中注册一个C函数。这个功能必须这样:
static int myfunc (lua_State *L) {
// your code
return X; /* X = number of results */
}
此函数仅接收Lua-State作为参数。 Luafunction调用的所有参数都放在lua堆栈上。你必须从Stack弹出然后用它调用你的C ++方法。
函数的注册很简单,用两行代码完成:
lua_pushcfunction(l, myfunc);
lua_setglobal(l, "myfuncnameinlua");
您可以在本书“this chapter”的programming in lua中找到更多相关信息。
你想要做的事情,实现一个Lua-Object有点复杂,因为你必须注册一个metatable来创建一个Lua对象,但你的Lua到C接口仍然是解释类型的函数。
您还可以在Roberto Ierusalimschy的书中chapter 28
精益实施Lua-Object我希望这会对你有所帮助