我正在用c ++设计游戏引擎。我目前正致力于对游戏中的不同实体进行分类。我的基类是SpriteObject,它有两个MovableObject和FixedObject继承的类。现在,如果我创建一个MovableObject的实例,并想将它添加到Sprite的Vector和MovableObject的Vector中,我只是这样做:
Vector<Sprite*> sprites;
Vector<MovableObject*> movableObjects;
MovableObject* movingObject = new MovableObject();
sprites.push_back(movingObject);
movableObjects.push_back(movingObject);
但随着不同类别和实体的增长,代码将变得越来越大(将每个实体添加到它所属的每个向量都会很烦人)。如何在创建对象时自动将对象添加到它所属的向量中?
编辑1:我想我想出了一个解决方案,如果我只创建一个全局静态类实体,它包含场景中所有实体的向量。每个实体都可以访问此类,并且在创建实体时,只需将其自身的指针版本添加到该全局类中的相应向量。
编辑2:但我忘了我的解决方案要求我仍然手动将每个实体添加到其匹配的矢量。我只是将工作分成不同的实体。
答案 0 :(得分:2)
这是一个很好的问题。
我认为我会像这样实现它:addToVector()
类中会有一个Sprite
方法,每个派生类都会覆盖它以将自己添加到相应的向量中。
答案 1 :(得分:1)
我建议采用不同的方法。但在我开始之前,我想说明你当前设计的一件事。
我会隐藏在立面后面的那些对象的创建。称之为场景或其他什么。从几个角度来看,手动使用new
是不好的。首先,如果您决定要更改分配/构建对象的方案,则必须在代码中的任何位置更改它。如果你有一个像Scene
这样的工厂,你就可以改变实施方式,而scene->CreateObject<Sprite>()
的呼叫在其他任何地方都会保持不变。一旦你开始添加自定义内存分配方案,对象池等内容,这可能会变得很重要,如果你开始增加你的引擎,你会在某些时候。即使这只是一个练习和一个有趣的项目,我们都希望这样做,就像实际完成一样,对吧;)?
现在回到核心 - 不要滥用继承。
MovableObject不是Sprite。静态对象也不是精灵。它们是可移动的和静态的元素。
精灵可以是可移动的或静态的,因此它具有动态或静态元素的行为。
改用构图。使Sprite接受行为,或更好地列出行为。事实上,Sprite本身也只是Game对象的行为,它只是控制它呈现给用户的方式。
如果你有一个可以附加多个行为的对象,例如它是动态的,它在场景中有一个精灵存在,甚至更多的是声音发射器!
如果您将这些行为添加到对象,则必须先创建它们。他们可以在构建时决定他们应该订阅哪个列表。
这实际上是一个众所周知的系统的隐喻,事实证明它运作良好,并且现在实际上在大多数游戏引擎中使用。它是一个实体组件系统。
行为的对象是实体,组件是那些行为,每个行为都由一个知道组件并知道如何更新/处理它们的系统控制。
场景中的物体只是一组附着在它们身上的组件。