2017-08-24 32 views
0

我了解ECS模式及其目标解决方案。不过,我正在努力寻找识别组件的最佳方式。同一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框架。

回答

0

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

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

如果你所使用的多个系统的一些数据,然后将它们分开像持有这将然后由动画系统和渲染系统都可以使用该实体的位置,旋转,大小等变换组件。

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

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

相关问题