使用Lua定义C++游戏中对象的变量
Using Lua to define variables of objects in a C++ game
这更多的是一个概念问题,帮助我理解事物是如何工作的。
在我的简单游戏引擎中,我有一个游戏对象类,它有所有常见的变量,比如:位置、方向、比例、速度、模型、纹理等等
现在我希望能够用脚本定义这些对象的行为。我理解如何对现有变量执行此操作。例如,如果速度!=0,更改位置。
但是我该如何定义新的属性呢?(例如健康、弹药)
我无法在游戏对象类中创建新的变量,因为该类已经编译,我也无法在脚本中添加变量,因为下次运行行为脚本时会重置变量。
这些事情通常是如何在游戏中完成的?
正如您所说,您的C++类已经编译完毕,无法更改。这不完全是真的。从纯C++的角度来看,
-
可以将属性添加到类中:为不同的对象类型定义两个std::映射,如果需要新属性,可以将其添加到相应的映射中,然后始终可以检索它。但是,对于每种类型的属性(int、bool、string)和每种可见性(private、protected、public),都需要单独的映射。
-
方法不能更改,即不能更改现有方法的代码以使用新属性。您可以通过将类存储函数指针作为数据成员来伪造添加方法,但这些函数将无法访问类的私有或受保护部分。
-
您可以使用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++级别创建全新的行为,除非您将所有内容都虚拟化。
结论:
- 您必须使C++类可扩展,并且您的设计能够使用派生类
- 你可以伪造Lua方面的类派生;SWIG让这件事变得很容易,假设#1做得很好
- 然后,您还应该能够提供将C++类扩展到C++的Lua实例以供以后使用,当您的C++代码在这些实例上调用虚拟方法时,将调用相应的Lua"方法">
- 你能重载对象变量名本身返回的内容吗
- 为什么我可以使用 memcpy 将一个对象变量复制到另一个对象变量
- 如何使用std::lower_bound比较对象变量,而不使用第二个对象进行比较
- 将私有对象变量与用户输入的变量进行比较
- 具有已定义操作重载的 C++ 非类型化值对象/变量库
- 如何对对象数组进行排序,而不考虑对象变量类型
- 在功能中设置对象变量
- 如何创建对象变量,以便每次分配新的指针
- C++ FileIO 以读取和写入对象变量
- 私下声明的对象变量的突变器/访问器方法
- C++ 列表中的对象变量在迭代过程中不会更新
- 稍后使用私有对象变量时如何初始化数组(初始化对象后)
- 通过向量更改对象变量的值
- C 全局对象变量内存释放
- 基本数据类型变量 VS 对象变量
- C 复制分配运算符,用于参考对象变量
- c++从列表中移除元素,并将其分配给对象变量
- 我们是否需要在C++中同步局部对象变量
- 点运算符和箭头运算符之间的区别 结构对象变量 在 C 或 C++ 中创建树
- 无法访问在 std 回调中传递的对象变量