【问题标题】:Lua to c++, instanced functions for entity modificationLua to c++,实体修改的实例化函数
【发布时间】:2012-09-08 17:02:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c++ lua


    【解决方案1】:

    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++ 定义那个表吗?
    • @DavidC 第一个参数是你调用它的任何东西——表、用户数据、任何你可以使用. 操作符的东西。表就是表,不管你是用 Lua 还是 C++ 创建的。
    • entity1:SetPosition(...) 会将表返回给 c++ 对吗?或其他一些数据类型
    • @DavidC 它不会返回任何东西给 C++。就像我在最后一条评论中所说的那样,它绝对会传递任何东西作为第一个参数——不管你怎么称呼它。这可能是一个表,但也可能是一个用户数据。
    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多