2017-08-24 4 views
0

Je comprends le schéma ECS et ce qu'il vise à résoudre. Cependant, j'ai du mal à trouver le meilleur moyen d'identifier les composants. Par exemple, je travaille sur un jeu où vous avez un vaisseau et vous pouvez attaquer d'autres joueurs/npc et collecter des ressources.Plusieurs propriétés dans le même composant ECS

Ai-je besoin d'un composant pour chaque propriété ou puis-je regrouper propriétés non apparentées dans le même composant?

Par exemple, avec une composante par propriété, il ressemblerait à ceci:

// 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; 
} 

Avec plusieurs composants par propriété, il ressemblerait à ceci:

// 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; 
} 

Je ne pense pas que cela fera une différence, mais j'utilise le framework Ashley de LibGDX.

Répondre

0

Je groupe habituellement des propriétés avec les systèmes qui les utilisent.

Par exemple, vous auriez un système d'animation et un système de rendu. Vous auriez alors un composant de texture qui contient toutes les données liées à la texture, et un composant d'animation qui contient toutes les données liées à l'animation. Si vous avez des données qui sont utilisées par plusieurs systèmes, gardez-les séparées comme un composant de transformation qui contient la position de l'entité, la rotation, la taille, etc. qui seront ensuite utilisées par le système d'animation et le système de rendu. Dans vos données d'exemple, vous conservez la position et la vélocité dans le même composant car elles seront probablement toutes deux utilisées pour déterminer la position de l'entité.

Cependant, ces règles ne sont pas définies et vous pouvez séparer tous les composants, ce qui vous donnera plus de flexibilité par la suite. Par exemple, vous voudrez peut-être ajouter un système plus tard, qui ne fonctionne que sur les entités qui ont une vélocité. La séparation des composants vous permet de créer une famille à partir du composant sans modifier les systèmes actuels. Si vous aviez votre vélocité dans un composant de transformation, vous deviez alors le séparer pour créer une famille ou utiliser le composant de transformation et ajouter une condition dans votre système.