(我正在描述的内容基于此设计:什么是实体系统框架?,向下滚动即可找到它)
我在用C ++创建实体组件系统时遇到了一些问题。我有我的Component类:
class Component { /* ... */ };
实际上是要创建其他组件的接口。因此,要创建自定义组件,我只需实现接口并添加将在游戏中使用的数据:
class SampleComponent : public Component { int foo, float bar ... };
这些组件存储在Entity类中,该类为Entity的每个实例提供唯一的ID:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
通过哈希组件的名称将组件添加到实体(这可能不是一个好主意)。当我添加一个自定义组件时,它被存储为组件类型(基类)。
现在,另一方面,我有一个System接口,它在内部使用Node接口。Node类用于存储单个实体的某些组件(因为系统对使用实体的所有组件不感兴趣)。当系统必须使用时update()
,它仅需要遍历由不同实体创建的存储节点。所以:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
现在的问题是:我通过将实体传递给SampleSystem来构建SampleNode。然后,SampleNode“检查”该实体是否具有SampleSystem要使用的必需组件。当我需要访问Entity中所需的组件时,就会出现问题:该组件存储在Component
(基类)集合中,因此我无法访问该组件并将其复制到新节点上。我已经通过将Component
down转换为派生类型来暂时解决了这个问题,但是我想知道是否有更好的方法可以做到这一点。我知道这是否意味着重新设计我已经拥有的东西。谢谢。