向绑定到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

点赞
stackoverflow用户1072889
stackoverflow用户1072889

无法直接调用您的 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。

希望这能帮助您。

2011-12-02 17:37:56
stackoverflow用户1368932
stackoverflow用户1368932

我认为我理解了这个问题,并且可能有解决方案的想法。lua怪物“类”和C++怪物类之间在技术上没有联系。当您在给定的lua对象上调用lua“成员函数”时,它不知道C++中特定的Monster对象。如果您想要调用C++对象的非静态方法,则不能使用lua C函数来完成此操作。您需要在某个地方附加一个userdata,其指针指向C++对象(要非常小心对象的生命周期-您必须使用full-userdata,并使用C函数覆盖lua中的__gc以销毁C++对象)。在这种情况下,您可以在Monster类上声明一个私有静态C++方法,该方法带有这个userdata,并且将指针强制转换并为特定的C++怪物对象调用非静态成员函数及其给定的参数。(我希望我理解了您的问题,并且我的答案足够清楚。)

2012-05-05 23:53:55
stackoverflow用户199201
stackoverflow用户199201

当你写下面这段代码:

function Monster:pounce(howhigh, bonus)

这是一种快捷方式:

Monster.pounce = function(self, howhigh, bonus)

所以很明显,像你所做的那样调用它:

Monster.pounce(badguy, 5, 1);

是有意义的。

但是你想要做一些不同的事情:从你的 C++ 模块中,你得到了一个名为 Monster 的表。你不想直接操作这个表本身,因为它(只)包含一个名为 create 的项,这是一个“monster”的构造函数。

我必须承认,我没有完全理解你链接到的代码,但是假设一个“monster”的方法是通过元表访问的,那么你可以在那个元表中插入方法 pounce

2013-01-03 19:17:00