我想为我的游戏引擎添加对Lua脚本的完全支持。我自己设定的最大目标之一是保持完全模块化。这意味着,除了Lua绑定部分之外,我不希望我的引擎的其余部分使用任何特定于Lua的功能。
直到现在,事实证明这并不困难。纯C ++到Lua函数绑定部分 - 比如绑定Vector,Color和Entity对象,以及诸如Draw库或Physics库之类的模块很容易与引擎的其余部分隔离。
现在,我的问题在于事件。我需要为脚本编写者提供一种响应游戏事件的方法。这涉及从引擎调用Lua函数。
示例:在Lua中使用C ++中的实体调用OnCreate
,OnUpdate
,OnCollide
。
这些事件发生在我的CEntity基类中,而Lua模块无法知道它们何时以及如何发生。
可能的解决方案:
糟糕的坏事!这是Lua绑定的东西混合到基本实体类中!
遗憾的是,我对此并不太了解。我确信它实现起来非常困难,并且还会带来一些小的逻辑和性能问题。
- 如何在我的C ++引擎中触发Lua中的事件(调用钩子函数),而不需要在程序的Lua绑定模块之外使用任何Lua绑定代码?
答案 0 :(得分:3)
游戏代码完成(第3版)有针对该确切问题的解决方案。基本上,他将引擎设置为具有通用事件系统,然后具有脚本模块,该模块为自己想要响应的事件注册自己。事件系统对Lua一无所知,Lua包装器只需知道它想要处理的事件的名称,因此耦合非常小。
答案 1 :(得分:3)
您可以选择(根据您的设计)LuaEntity派生类,它处理这些东西。您也可以选择使用多态仿函数(boost :: function),它可以动态提供和更改。