将Lua绑定的粘合代码与我的游戏引擎其他部分分离。

我想要在我的游戏引擎中添加完整的 Lua 脚本支持。我设定的最大目标之一是保持完全的可模块化,这意味着,除了 Lua 绑定部分以外的整个引擎都不应当使用任何 Lua 特定的功能。这到目前为止并不难。将 C++ 函数绑定到 Lua 的部分 - 例如将 Vector、Color 和 Entity 对象进行绑定,以及一些类似于 Draw 和 Physics 库的模块 - 都可以很容易地与引擎的其余部分隔离开来。

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

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

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

可能的解决方案:

  • 在 C++ 基类实体中添加一个事件调用,触发 Lua 脚本中的一个事件

这么做是很不好的,会把 Lua 绑定的代码混杂在基类实体中。

  • 在我的引擎中添加某种事件系统,使实体事件触发一个可以被 Lua 绑定模块捕捉和适当处理的事件。

不幸的是,我并不知道太多关于这个的信息。我相信它实现起来会非常困难,并且还会带来一些较小的逻辑和性能问题。

- 如何在不让任何 Lua 绑定代码走出我的程序的 Lua 绑定模块的情况下,从 C++ 引擎中触发事件 (调用钩子函数) 在 Lua 中?

原文链接 https://stackoverflow.com/questions/5146896

点赞
stackoverflow用户529761
stackoverflow用户529761

《游戏编码完全指南》(第三版)针对这个确切的问题提供了解决方案。基本上,它设置引擎具有通用事件系统,然后有一个脚本模块注册自己要响应的事件。事件系统对 Lua 一无所知,Lua 包装器只需要知道它想要处理的事件名称,因此耦合非常小。

2011-02-28 20:07:09
stackoverflow用户298661
stackoverflow用户298661

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

2011-02-28 20:11:49