1

我一直在研究一个简单的基于组件的 c++ 和 lua 游戏引擎。目前所有的子系统,如音频和物理,都可以从 lua 调用,并使用luaL_newlib.

我遇到的问题是 lua 脚本如何调用函数来修改其实体。LikeSetPosition()显然需要在实体实例而不是静态函数上调用。那么有没有办法让我拥有这些实例化的功能。

我的一个想法是每个实体都为自己注册函数,并使用它唯一的模块名称。所以它看起来像entity1.Setpositionentity2.Setposition。是否可以注册,有效地复制这样的功能?

或者是否有另一种方法可以拥有这样的实例化函数,以便组件可以修改它们所属的实体?

如果我对自己的解释很糟糕,请务必说出来,我很乐意提供更多信息

4

1 回答 1

3

Lua 有“实例方法”的语法糖。如果您使用冒号而不是点调用函数,如下所示:

entity1:SetPosition(...)

然后 Lua 将其重写为:

entity1.SetPosition(entity, ...)

换句话说,它添加了一个隐式的第一个参数,即调用该方法的对象。在 C 方面,您只会看到一个额外的参数。这是创建实例方法的首选方式。


另外两件值得注意的事情:上面的重写并不是真正发生的事情。如果你做这样的事情:

SomeFunctionReturningEntity():SetPosition(...)

它不会将其重写为

SomeFunctionReturningEntity().SetPosition(SomeFunctionReturningEntity(), ...)

正如您所期望的那样,它实际上只调用了一次该函数。

此外,如果您是从 Lua 本身而不是 C 编写实例方法,则可以使用语法糖来声明:

function entity1:SetPosition(...)
end

这相当于:

function entity1.SetPosition(self, ...)
end

即它将隐式的第一个参数添加到函数中,并调用它self

(顺便说一句,这也相当于:

entity1.SetPosition = function(self, ...)
end

从技术上讲,即使在表中声明一个函数也是语法糖。)

于 2012-09-08T17:08:41.170 回答