Questions à propos de l'Entity Component System

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je suis en train de lire le livre SFML Game Development, et dans le chapitre 3, ils parlent brièvement de l'Entity Component System. C'est celui que j'ai choisi d'implémenter. J'ai donc lu quelques articles et tutoriels, en particulier ceux là :

-http://guillaume.belz.free.fr/doku.php?id=ecs

-http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/

Mais je pense ne pas avoir tout à fait compris. Par exemple, admettons que j'ai un joueur et qu'au début de la partie, il ai 20 points de vie. Il a donc un Component Vivant.

Concrètement, que contient ce component? Des variables, comme pointsDeVie ou estVivant?

+0 -0
Auteur du sujet

D'accord, merci. Mais du coup, si par exemple j'ai deux joueurs, c'est le même composant Vivant? Et si oui, comment sont stockées les données? Parce que pour moi, pour l'instant, c'était le même composant pour tout le monde, mais je me suis rendu compte que là, par exemple, toute les entités n'ont pas le même nombre de points de vie, et j'avoue que je ne sais pas trop comment faire:/

+0 -0
Auteur du sujet

Donc une entité serait plutôt par exemple représentée comme ceci:

1
std::map<unsigned int, std::map<unsigned int, Component>>

que :

1
std::map<unsigned int, std::map<unsigned int, std::shared_ptr<Component>>>

Et aussi, autre question:) Pour l'assignation des IDs, vaut il mieux faire un std::uint32_t, et l'incrémenter à chaque fois ou alors combiner ça avec une fonction appelée lorsqu'on détruit une entité, qui remplit une std::queue d'IDs libres?

Sachant que je ne compte pas faire un MMORPG avec des millions de joueurs, mais pour le principe.

Édité par 91

+0 -0

(mon tuto n'est pas réellement un tuto. C'est un début de tuto qui a été arrêter pour cause de manque de temps, avec pas mal de prises de note. Pas étonnant que ça ne soit pas clair)

Il n'y a pas forcement d’implémentation standard d'un ECS, donc cela dépend beaucoup des besoins et de comment on conçoit les choses.

Pour moi, l'approche avec une map n'est pas une bonne idée. Cela implique un héritage de tous tes composants, ce qui te fais retourner sur une approche POO. (Dans l'editeur d'Unity, les composants sont affichees comment enfant des entites - ce qui est effectivement le concept. Mais cela en veut pas dire que en interne, ce soit implementee comme cela).

De plus, je ne vois pas forcement de raison de cette map, a quel besoin elle repond. Du coup, je prefere l'implementation :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
using Entity = size_t;

class XxxComponent {
    Entity m_entity{};
    ... reste des données de chaque component
};

class YyySystem {
    vector<XxxComponent> m_components{};
};
+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte