4

我一直在研究如何将 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 ++之间绑定的限制/我如何绑定这两种语言?

4

3 回答 3

0

当你写

function Monster:pounce(howhigh, bonus)

这是一个快捷方式

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

所以显然是这样称呼的

Monster.pounce(badguy, 5, 1);

正如你所做的那样是有道理的。

但是您想做一些不同的事情:从您的 C++ 模块中,您得到一个名为Monster. 您不想操作此表本身,因为它(仅?)包含一个名为 的条目create,即 amonster的构造函数。

我必须承认我没有完全得到你链接到的代码,但是假设一个怪物的方法被一个元表访问,你可以pounce在那个元表中插入这个方法。

于 2013-01-03T19:17:00.507 回答
0

认为我理解这个问题,并且可能对解决方案有所了解。从技术上讲,lua Monster 'class' 和 C++ Monster 类之间没有联系。当您在给定的 lua 对象上调用 lua“成员函数”时,它不知道 C++ 中的特定 Monster 对象。如果要调用 C++ 对象的非静态方法,则不能使用 lua C 函数来执行此操作。您需要在 lua 对象的某个位置附加一个用户数据,该对象具有指向 C++ 对象的指针(要非常小心对象的生命周期 - 您必须使用完整的用户数据并使用 C 函数覆盖 lua 中的 __gc 破坏C++ 对象)。在这种情况下,您可以在需要此用户数据的 Monster 类上声明一个私有静态 C++ 方法,然后使用给定的参数转换指针并为这个特定的 C++ 怪物对象调用非静态成员函数。(我希望我理解你的问题,并且我的答案写得足够清楚。)

于 2012-05-05T23:53:55.493 回答
-3

无法直接使用其所有参数调用您的 C-Object/Function。你必须在你的 Lua-State 中注册一个 C-Function。这个函数必须是这样的:

static int myfunc (lua_State *L) {
  // your code
  return X;  /* X = number of results */
}

这个函数只接收 Lua-State 作为参数。放置在 lua 堆栈上的 Luafunction 调用的所有参数。然后你必须从堆栈中弹出并用它调用你的 C++ 方法。

函数的注册非常简单,只需两行代码即可:

lua_pushcfunction(l, myfunc);
lua_setglobal(l, "myfuncnameinlua");

您可以在本书“用 lua 编程”的这一章中找到更多信息

你想做的事情,实现一个 Lua 对象有点复杂,因为你必须注册一个元表来创建一个 Lua 对象,但你的 Lua 到 C 接口仍然是解释类型的函数。

您还可以在 Roberto Ierusalimschy 的书中第 28 章中实现 Lua 对象

我希望这能帮到您

于 2011-12-02T17:37:56.777 回答