这是一个概念性的问题,可以帮助我了解事情是如何运作的。
在我的简单游戏引擎中,我有一个游戏对象类,它包含所有常用变量,如:位置,方向,比例,速度,模型,纹理等。
现在我希望能够使用脚本来定义这些对象的行为。 我理解如何对现有变量这样做。例如,如果velocity!= 0,则更改位置。
但是如何定义新属性? (例如Health,Ammo)
我无法在游戏对象类中创建新变量,因为该类已经被编译,并且我无法在脚本中添加变量,因为它将在下次运行行为脚本时重置。
这些事情通常是如何在游戏中完成的?
答案 0 :(得分:2)
正如您所说,您的C ++类已经被压缩,无法更改。嗯,这不完全正确。从纯C ++的角度来看,
可以为类添加属性:为不同的对象类型定义几个std :: maps,如果需要新属性,可以将其添加到适当的地图,然后始终可以检索它。但是,您需要为每种类型的属性(int,bool,string)和每个可见性(private,protected,public)单独映射。
无法更改方法,即无法更改现有方法的代码以使用新属性。您可以通过将类存储函数指针作为数据成员来伪造添加方法,但这些函数无法访问类的私有或受保护部分。
您可以使用OO多态,即添加属性,更改现有方法和添加方法,您将创建一个派生自base的新类。
关于系统的C ++方面,这一切都很好,但是你所说的问题是你无法动态创建一个类:它必须被编译。所以现在你带来了Lua。你不能让Lua在C ++级别生成派生类。
如果您的C ++类具有虚拟方法,请创建一个派生自您的基类的类,以便可以从Lua实例化它并转发到Lua实例的正确Lua函数。有了这个,Lua脚本可以扩展C ++类,并在C ++中注册对象,当C ++在该对象上调用虚方法时,它将调用扩展该类的相关Lua方法。我自己并没有手动完成,但SWIG(www.swig.org)是一个通过其“导演”功能轻松完成的工具。许多人自己做Lua-C ++绑定,或使用luabind,或SWIG,或其他。我创建了自己的lua-icxx,它与SWIG协同工作,所以这是一种不同的方法。在任何情况下,这都不允许您在C ++级别创建全新的行为,除非您将所有内容都设置为虚拟。
结论: