将 Lua 转换成 C++,为实体修改提供实例化函数。

我一直在开发一个简单的基于组件的 C++ 和 Lua 游戏引擎。目前所有的子系统,比如音频和物理引擎都可以通过自己的模块使用 luaL_newlib 从 Lua 中调用。

我遇到的问题是,如何让 Lua 脚本调用函数来修改其实体。例如 SetPosition() 显然需要在实体的实例上调用,而不是静态函数。那么我怎样才能有这些实例函数呢?

我想到的一个方法是,每个实体都用一个唯一的模块名称来注册自己的函数。这样看起来就像 entity1.Setpositionentity2.Setposition 这样。我可以注册这些函数来有效地复制它们吗?

还是说有其他方法可以实现这样的实例函数,以便组件可以修改它们所属的实体?

如果我解释得不好,请告诉我,我很乐意提供更多信息。

点赞
用户5696
用户5696

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

(顺便说一句,甚至在表格内部声明函数也是语法糖。)

2012-09-08 17:08:41