从我的游戏引擎的其余部分中隔离Lua绑定粘合代码

时间:2011-02-28 19:57:38

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

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

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

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

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

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

可能的解决方案:

  • 向C ++基本实体中的事件添加函数调用,该事件触发Lua脚本中的事件

糟糕的坏事!这是Lua绑定的东西混合到基本实体类中!

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

遗憾的是,我对此并不太了解。我确信它实现起来非常困难,并且还会带来一些小的逻辑和性能问题。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您可以选择(根据您的设计)LuaEntity派生类,它处理这些东西。您也可以选择使用多态仿函数(boost :: function),它可以动态提供和更改。