【发布时间】:2009-04-15 21:14:12
【问题描述】:
我这几天一直在脑子里琢磨这个问题,但没有得出任何令人满意的结论,所以我想我会向 SO 工作人员征求他们的意见。对于我正在开发的游戏,我使用了 here 和 here 中描述的组件对象模型。它实际上进展顺利,但我当前的存储解决方案被证明是有限的(我只能通过它们的类名或任意“家族”名称来请求组件)。我想要的是能够请求给定类型并遍历该类型的所有组件或从它派生的任何类型。
考虑到这一点,我首先实现了一个简单的 RTTI 方案,该方案按该顺序通过派生类型存储基类类型。这意味着,比如说,一个精灵的 RTTI 将是:component::renderable::sprite。这让我可以轻松地比较类型,以查看类型 A 是否源自类型 B,只需比较 B 的所有元素:即 component::renderable::sprite 源自 component::renderable 但不是 component::timer。简单、有效且已实施。
我现在想要的是一种以代表该层次结构的方式存储组件的方法。首先想到的是使用类型作为节点的树,如下所示:
component
/ \
timer renderable
/ / \
shotTimer sprite particle
在每个节点上,我都会存储该类型所有组件的列表。这样,请求“component::renderable”节点将使我能够访问所有可渲染组件,而不管派生类型如何。问题是我希望能够使用迭代器访问这些组件,这样我就可以执行以下操作:
for_each(renderable.begin(), renderable.end(), renderFunc);
并让它从可渲染向下迭代整个树。我使用一个非常丑陋的地图/向量/树节点结构和一个自定义前向迭代器来跟踪我所在位置的节点堆栈,这几乎可以完成这项工作。不过,在实施的过程中,我觉得必须有一种更好、更清晰的方法……我只是想不出一个:(
所以问题是:我是否不必要地过度复杂化了?我是否缺少一些明显的简化,或者我应该使用预先存在的结构?或者这只是一个复杂的问题,我可能已经做得很好了?
感谢您的任何意见!
【问题讨论】: