现在,在我开始之前,我想说我知道没有标准的方法来实现ECS。但是,有一种我感兴趣的方法,但对一个特定的东西感到困惑。
假设您有一个包含TransformComponent(包含位置)的实体和一个RenderComponent(包含一个Sprite),并且您还有一个与实体分开的RenderSystem。 RenderSystem将使用RenderComponent处理所有组件的呈现,并且不关心它附加到哪个实体。但由于Sprite需要一个位置,因此RenderSystem也需要TransformComponent。
现在我感到困惑的部分是,如果所有组件都存储在它们自己的组件类型的向量中,我将如何获得同时具有TransformComponent和RenderComponent的所有实体?我不想使用循环遍历每个系统中所有实体的朴素方法,拉出具有这两个组件的实体,而是在组件类型的向量中包含每个组件。 此外,系统如何知道2个组件属于同一个实体?组件是否附加了EntityID?
编辑:我刚刚意识到一些事情,如果RenderSystem循环遍历所有RenderComponents并获取实体,然后检查该实体是否也包含TransformComponent,然后它可以渲染它。但是,这种情况会破坏整个系统"系统不关心实体",这也要求组件具有EntityID,我仍然不确定它是否应该具有。有人请为我澄清这一切。
答案 0 :(得分:1)
这部分是调用Entity Handler,它需要做很多工作。
我所知道的最简单的形式是这样的:
将每个组件移动到一个大数组(缓存为King)。 每个组件都需要一个枚举:
enum E_Component {
Velocity,
Position,
...
};
现在你的Entity只是一个索引和一个组件索引数组。
struct Entity {
unsigned index;
unsigned components[NB_COMPONENTS]; // -1 if nothing
};
因此,如果系统需要更新速度组件,您需要做的就是循环实体,检查是否有速度组件并更新它。
==>系统不关心实体,只关心组件。
有很多更好的方法,请看一下这个article