2017-08-24 28 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

我通常將組件屬性與使用它們的系統進行分組。

例如,您將擁有一個動畫系統和一個渲染系統。然後,您將擁有一個包含所有紋理相關數據的紋理組件以及一個包含所有動畫相關數據的動畫組件。

如果你所使用的多個系統的一些數據,然後將它們分開像持有這將然後由動畫系統和渲染系統都可以使用該實體的位置,旋轉,大小等變換組件。

在您的示例數據中,您可以將位置和速度保留在同一個組件中,因爲它們很可能用於計算實體的位置。

但是,這些不是設置規則,您可以將所有組件分開,這會稍後爲您提供更大的靈活性。例如,您可能希望稍後添加一個僅適用於具有速度的實體的系統。將組件分開可讓您從組件創建一個系列,而不需要對當前系統進行任何更改。如果您在變換部件有你的速度,你將不得不分離它來創建一個家庭或使用變換組件,並在系統中添加一些條件。

相關問題