隔离Lua绑定游戏引擎其余部分的胶水代码

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

直到现在,这已经证明并不困难。 纯C ++到Lua函数的绑定部分 - 就像绑定Vector,Color和Entity对象,以及诸如Draw库或Physics库这样的模块,很容易与引擎的其余部分隔离。

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

示例:在Lua中的C ++实体上调用OnCreateOnUpdateOnCollide

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

可能的解决方案:

  • 向C ++基础实体中的事件添加一个函数调用,这会在Lua脚本中触发一个事件
  • 坏坏坏! 这是Lua绑定的东西混合到基础实体类中!

  • 在我的引擎中添加某种事件系统,其中实体事件触发一个事件,该事件也可以被Lua绑定模块捕获并进行适当处理。
  • 不幸的是,我不太了解这一点。 我相信这会很难实现,也会带来一些小的逻辑和性能问题。

    - 如何在我的C ++引擎中触发Lua中的事件(调用一个钩子函数),而不在我的程序的Lua绑定模块之外有任何Lua绑定代码?


    游戏代码完成(第三版)有一个解决方案,确切的问题。 基本上,他将引擎设置为具有通用事件系统,然后有一个脚本模块,用于注册自己想要响应的事件。 事件系统对Lua一无所知,而Lua包装器只需知道它想要处理的事件的名称,所以耦合是非常小的。


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

    链接地址: http://www.djcxy.com/p/30687.html

    上一篇: Isolate Lua bindings glue code from the rest of my game engine

    下一篇: State with namespaces and locals