gpt4 book ai didi

c++ - Lua 到 C++,用于实体修改的实例化函数

转载 作者:行者123 更新时间:2023-11-30 03:00:13 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

关于c++ - Lua 到 C++,用于实体修改的实例化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12332738/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com