gpt4 book ai didi

c++ - 实体组件系统困惑

转载 作者:行者123 更新时间:2023-11-28 06:00:52 29 4
gpt4 key购买 nike

现在,在开始之前,我想说我知道没有标准的方法来实现 ECS。但是,有一种方法我很感兴趣,但对一件特定的事情感到困惑。

假设您有一个带有 TransformComponent(包含一个位置)和一个 RenderComponent(包含一个 Sprite)的实体,并且您还有一个与实体分开的渲染系统。RenderSystem 将使用 RenderComponent 处理所有组件的渲染,并且不会关心它附加到哪个实体。但是由于 Sprite 需要一个位置,RenderSystem 也需要 TransformComponent。

现在是我感到困惑的部分,如果所有组件都存储在它们自己的该组件类型的 vector 中,我将如何获得同时具有 TransformComponent 和 RenderComponent 的所有实体?我不想使用遍历每个系统中的所有实体的天真方法,提取具有这两个组件的实体,而是将每个组件都放在组件类型的 vector 中。此外,系统如何知道 2 个组件属于同一个实体?组件是否会附加一个 EntityID?

编辑:我刚刚意识到,如果 RenderSystem 循环遍历所有 RenderComponents 并获取实体,然后检查该实体是否也包含 TransformComponent,然后它可以渲染它。但这有点破坏了整个“系统不关心实体”,这也要求组件有一个 EntityID,我仍然不确定它是否应该有。请有人为我澄清这一切。

最佳答案

这部分是调用Entity Handler,这是一个需要大量工作的东西。

我所知道的最简单的形式是这样的:

将每个组件移动到一个大数组中(缓存为王)。每个组件都需要一个枚举:

enum E_Component {

Velocity,
Position,
...
};

现在您的实体只是一个索引和一个组件索引数组。

struct Entity {

unsigned index;
unsigned components[NB_COMPONENTS]; // -1 if nothing
};

因此,如果一个系统需要更新速度分量,您需要做的就是遍历您的实体,检查是否有速度分量并更新它。

==> 系统不关心实体,只关心组件。


有很多更好的方法,看看这个 article

关于c++ - 实体组件系统困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316352/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com