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

时间:2014-02-23 14:48:21

标签: c++ scripting lua

这是一个概念性的问题,可以帮助我了解事情是如何运作的。

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

现在我希望能够使用脚本来定义这些对象的行为。 我理解如何对现有变量这样做。例如,如果velocity!= 0,则更改位置。

但是如何定义新属性? (例如Health,Ammo)

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

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

1 个答案:

答案 0 :(得分:2)

正如您所说,您的C ++类已经被压缩,无法更改。嗯,这不完全正确。从纯C ++的角度来看,

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

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

  3. 您可以使用OO多态,即添加属性,更改现有方法和添加方法,您将创建一个派生自base的新类。

  4. 关于系统的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 ++级别创建全新的行为,除非您将所有内容都设置为虚拟。

    结论:

    1. 您必须使您的C ++类可扩展,并且您的设计能够使用派生类。
    2. 你可以从Lua那边伪造类派生;假设#1正确完成,SWIG使这很容易做到。
    3. 您还应该能够将您的Lua实例扩展为C ++类以供以后使用,当您的C ++代码在这些实例上调用虚方法时,相应的Lua“方法”将被调用。