【问题标题】:Isolate Lua bindings glue code from the rest of my game engine将 Lua 绑定胶水代​​码与我的游戏引擎的其余部分隔离开来
【发布时间】:2011-07-06 00:52:57
【问题描述】:

我想为我的游戏引擎添加对 Lua 脚本的全面支持。我为自己设定的最大目标之一是保持完全的模块化。这意味着,除了 Lua 绑定部分之外,我不希望我的引擎的其余部分使用任何 Lua 特定的功能。

直到现在,事实证明这并不难。纯 C++ 到 Lua 函数的绑定部分——比如绑定 Vector、Color 和 Entity 对象,以及 Draw 库或 Physics 库等模块很容易与引擎的其余部分隔离。

现在,我的问题在于事件。我需要为脚本编写者提供一种响应游戏事件的方法。这涉及从引擎调用 Lua 函数。

示例:在 Lua 中对来自 C++ 的实体调用 OnCreateOnUpdateOnCollide

这些事件发生在我的 CEntity 基类中,Lua 模块无法知道它们何时以及如何发生。

可能的解决方案:

  • 在 C++ 基础实体中的事件中添加函数调用,从而触发 Lua 脚本中的事件

坏坏坏!这是 Lua 绑定的东西,直接混入了基础实体类!

  • 向我的引擎添加某种事件系统,其中实体事件触发一个事件,该事件也可以被 Lua 绑定模块捕获并进行适当处理。

不幸的是,我对此知之甚少。我敢肯定这将很难实现,并且还会带来一些小的逻辑和性能问题。

- 在我的程序的 Lua 绑定模块之外没有任何 Lua 绑定代码的情况下,如何在我的 C++ 引擎中触发 Lua 中的事件(调用挂钩函数)?

【问题讨论】:

    标签: c++ design-patterns lua game-engine


    【解决方案1】:

    Game Code Complete(第 3 版)针对该问题提供了解决方案。基本上,他将引擎设置为具有通用事件系统,然后有一个脚本模块,该模块为它想要响应的事件注册自己。事件系统对 Lua 一无所知,Lua 包装器只需要知道它要处理的事件的名称,因此耦合非常小。

    【讨论】:

      【解决方案2】:

      您可以选择拥有(取决于您的设计)一个 LuaEntity 派生类来处理这些东西。您也可以选择使用多态函子 (boost::function),它可以随时提供和更改。

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 1970-01-01
        • 2015-12-06
        • 2017-10-03
        • 1970-01-01
        • 2011-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多