C++中具有不同类的子/父结构

Child/Parent structure with different classes in C++

本文关键字:结构 同类 C++      更新时间:2023-10-16

我决定用自己的简单引擎制作下一个游戏。我已经为对象渲染、物理等编写了一些代码,现在我正在考虑如何轻松地将它们连接在一起。

我想用一个主对象建立层次结构,让我们称之为场景,它将有作为精灵或交互对象的父对象,每个精灵或交互物体都可以有自己的子对象,也有自己的孩子。。我想你已经明白我的意思了:)

让我们假设,每个对象类型都将继承自某个基本对象,例如,我们将其称为Node。我还不确定Node是否是"真实"的对象,它会有自己的大小、位置等,或者只是游戏中每个对象的抽象包装器(实际上我倾向于选择第二个)。

最后。我的目标是,拥有实际场景的对象,调用类似Scene->Move(x,y)的东西,它会移动场景的每个子对象(或精灵、交互对象等)。或者Scene->Render(),它会渲染每个(可渲染的)子对象。如果我创建Sprite,我想添加类似Sprite->addChild()的子对象,并且子对象可以是另一个Sprite、InteractiveObject或只是简单的Node。

现在是我的问题。用C++实现它的最佳方法是什么?还是我完全错了,这种结构很愚蠢?:)

我应该认为,结构是否合理在一定程度上取决于您真正想要实现的目标——系统听起来非常灵活,但通常在灵活性和性能之间存在权衡。根据游戏的类型,性能可能很难获得。

此外,如果所有的东西都派生自某个BaseNode,那么它们都需要(尽管可能是空的)用于所有类型的东西的方法,无论它们是否真的可以被渲染、移动等等。或者你最终会得到很多dynamic_casts,这也不是很好。因此,最好稍微减少灵活性,并区分游戏实体和图形实体,后者是前者的一部分(不过,您可能希望允许游戏实体由多个图形实体或子实体组成)。

如果你使用当前的体系结构,我应该认为每个BaseObject都有一个向量,当你对主对象调用render()时,它会遍历它的所有子对象,并对它们调用render。它们执行相同的操作,并执行任何适合它们的渲染代码。

然而,另一个问题是,一个对象是否可以连接到其他几个对象上(例如,如果渲染和物理之间存在差异)。如果是这样的话,除非你不使用普通的BaseObject*,而是使用某种形式的auto_ptr或shared_ptr,否则知道何时删除对象可能会很麻烦。

我希望这个答案能对你有所帮助,尽管我意识到这不是一个简单的"这就是他们的方式!"。