使用Lua定义C++游戏中对象的变量

Using Lua to define variables of objects in a C++ game

本文关键字:对象 变量 游戏 Lua 定义 C++ 使用      更新时间:2023-10-16

这更多的是一个概念问题,帮助我理解事物是如何工作的。

在我的简单游戏引擎中,我有一个游戏对象类,它有所有常见的变量,比如:位置、方向、比例、速度、模型、纹理等等

现在我希望能够用脚本定义这些对象的行为。我理解如何对现有变量执行此操作。例如,如果速度!=0,更改位置。

但是我该如何定义新的属性呢?(例如健康、弹药)

我无法在游戏对象类中创建新的变量,因为该类已经编译,我也无法在脚本中添加变量,因为下次运行行为脚本时会重置变量。

这些事情通常是如何在游戏中完成的?

正如您所说,您的C++类已经编译完毕,无法更改。这不完全是真的。从纯C++的角度来看,

  1. 可以将属性添加到类中:为不同的对象类型定义两个std::映射,如果需要新属性,可以将其添加到相应的映射中,然后始终可以检索它。但是,对于每种类型的属性(int、bool、string)和每种可见性(private、protected、public),都需要单独的映射。

  2. 方法不能更改,即不能更改现有方法的代码以使用新属性。您可以通过将类存储函数指针作为数据成员来伪造添加方法,但这些函数将无法访问类的私有或受保护部分。

  3. 您可以使用OO多态性,通过它可以添加属性、更改现有方法和添加方法,您可以创建一个从基类派生的新类。

对于系统的C++端来说,这一切都很好,但正如您所说的问题是,您不能动态创建一个类:必须对其进行编译。所以现在你引进了卢。您不能让Lua在C++级别生成派生类。

如果你的C++类有虚拟方法,那么创建一个从你的基类派生的类,这样它就可以从Lua实例化,并转发到你的Lua实例的正确Lua函数。有了这个,Lua脚本可以扩展C++类,并在C++中注册对象,当C++在该对象上调用虚拟方法时,它将调用扩展该类的关联Lua方法。我自己并没有手动做到这一点,但SWIG(www.SWIG.org)是一个通过其"导演"功能非常容易做到的工具。许多人自己做Lua-C++绑定,或者使用luabind、SWIG或其他。我创建了自己的lua-icxx,它与SWIG协同工作,所以这是一种不同的方法。在任何情况下,这都不允许您在C++级别创建全新的行为,除非您将所有内容都虚拟化。

结论:

  1. 您必须使C++类可扩展,并且您的设计能够使用派生类
  2. 你可以伪造Lua方面的类派生;SWIG让这件事变得很容易,假设#1做得很好
  3. 然后,您还应该能够提供将C++类扩展到C++的Lua实例以供以后使用,当您的C++代码在这些实例上调用虚拟方法时,将调用相应的Lua"方法">