同一ECS组件中的多个属性

时间:2017-08-24 10:45:37

标签: java design-patterns libgdx

我理解ECS模式及其旨在解决的问题。但是我很难找到识别组件的最佳方法。

例如,我正在制作一个你有船的游戏,你可以攻击其他玩家/ npc并收集资源。

我是否需要为每个属性创建一个组件,还是可以将明显不相关的属性分组到同一个组件中?

例如,每个属性的组件看起来像这样:

// Components
Position {
    int x, y;
}
Velocity {
    int speed;
    double direction;
}
Sprite {
    Image[] images;
}
Health {
    int health;
}
Name {
    String name;
}
Resource {
    // Tag for resources.
}

// Entities
MapEntity {
    Position position;
    Sprite sprite;
}
ResourceEntity {
    Position position;
    Sprite sprite;
    Resource resource;
}
ShipEntity {
    Position position;
    Sprite sprite;
    Velocity velocity;
    Health health;
    Name name;
}

每个属性有多个组件,它们看起来像这样:

// Components
MapObject {
    int x, y; // Position
    Image[] images; // Sprite
}
Resource {
    // Tag for resources
}
Velocity { // separated component for static map entities
    int speed;
    double direction;
}
Ship {
    int health
    String name;
}

// Entities
MapEntity {
    MapObject mapObject;
}
ResourceEntity {
    MapObject mapObject;
    Resource resource;
}
Ship {
    MapObject mapObject;
    Velocity velocity;
    Ship ship;
}

我认为它不会有所作为,但我正在使用LibGDX的Ashley框架。

1 个答案:

答案 0 :(得分:0)

我通常使用使用它们的系统对属性进行分组。

例如,您将拥有一个动画系统和一个渲染系统。然后,您将拥有一个包含所有纹理相关数据的纹理组件,以及一个包含所有动画相关数据的动画组件。

如果您有一些由多个系统使用的数据,那么请将它们分开,就像保存实体位置,旋转,大小等的变换组件一样。然后动画系统和渲染系统将使用它们。

在您的示例数据中,您将位置和速度保持在同一个组件中,因为它们很可能都用于计算实体的位置。

但是,这些都不是设置规则,您可以将所有组件分开,这将在以后为您提供更大的灵活性。例如,您可能希望稍后添加一个系统,该系统仅适用于具有速度的实体。将组件分开后,您可以从组件创建族,而不对当前系统进行任何更改。如果在变换组件中有速度,则必须将其分离以创建族或使用变换组件并在系统中添加一些条件。