Il s'agit d'une suite à cette question, à laquelle j'ai répondu, mais celle-ci aborde un sujet beaucoup plus spécifique.
Cette réponse m'a aidé à mieux comprendre Entity Systems que l'article.
J'ai lu l'article (oui, le) sur Entity Systems, et il m'a dit ce qui suit:
Les entités ne sont qu'un identifiant et un tableau de composants (les articles indiquent que le stockage d'entités dans des composants n'est pas une bonne façon de faire les choses, mais ne fournit pas d'alternative).
Les composants sont des éléments de données qui indiquent ce qui peut être fait avec une certaine entité.
Les systèmes sont les "méthodes", ils effectuent des manipulations de données sur des entités.
Cela semble vraiment pratique dans de nombreuses situations, mais la partie sur les composants qui ne sont que des classes de données me dérange. Par exemple, comment pourrais-je implémenter ma classe Vector2D (Position) dans un système d'entité?
La classe Vector2D contient des données: les coordonnées x et y, mais elle a également des méthodes , qui sont cruciales pour son utilité et distinguent la classe d'un simple tableau à deux éléments. Méthodes sont par exemple: add()
, rotate(point, r, angle)
, substract()
, normalize()
et toutes les autres normes, méthodes utiles et absolument nécessaires que les positions (qui sont des instances de la classe Vector2D) devrait avoir.
Si le composant n'était qu'un détenteur de données, il ne pourrait pas avoir ces méthodes!
Une solution qui pourrait probablement apparaître serait de les implémenter dans des systèmes, mais cela semble très contre-intuitif. Ces méthodes sont des choses que je veux effectuer maintenant , qu'elles soient complètes et prêtes à l'emploi. Je ne veux pas attendre la MovementSystem
lecture d'un ensemble coûteux de messages qui lui demandent d'effectuer un calcul sur la position d'une entité!
Et, l'article indique très clairement que seuls les systèmes devraient avoir une fonctionnalité, et la seule explication à cela, que j'ai pu trouver, était "d'éviter la POO". Tout d'abord, je ne comprends pas pourquoi devrais-je m'abstenir d'utiliser des méthodes dans les entités et les composants. La surcharge de mémoire est pratiquement la même, et lorsqu'ils sont couplés à des systèmes, ils devraient être très faciles à mettre en œuvre et à combiner de manière intéressante. Les systèmes, par exemple, ne pouvaient fournir une logique de base qu'aux entités / composants qui connaissent eux-mêmes la mise en œuvre. Si vous me demandez - c'est essentiellement en prenant les goodies à la fois de ES et OOP, quelque chose qui ne peut pas être fait selon l'auteur de l'article, mais cela me semble être une bonne pratique.
Pensez-y de cette façon; il existe de nombreux types d'objets à dessiner dans un jeu. Images pures et simples, des animations ( update()
, getCurrentFrame()
, etc.), des combinaisons de ces types primitifs, et tous pourraient simplement fournir une draw()
méthode pour le système de rendu, qui ne puis pas besoin de se soucier de la façon dont l'image - objet d'une entité est mis en œuvre, seulement sur l'interface (dessiner) et la position. Et puis, je n'aurais besoin que d'un système d'animation qui appellerait des méthodes spécifiques à l'animation qui n'ont rien à voir avec le rendu.
Et juste une autre chose ... Existe-t-il vraiment une alternative aux tableaux quand il s'agit de stocker des composants? Je ne vois aucun autre endroit pour les composants à stocker autre que des tableaux à l'intérieur d'une classe d'entité ...
C'est peut-être une meilleure approche: stocker les composants comme de simples propriétés d'entités. Par exemple, un composant de position serait collé entity.position
.
La seule autre façon serait d'avoir une sorte de table de recherche étrange à l' intérieur des systèmes, qui fait référence à différentes entités. Mais cela semble très inefficace et plus compliqué à développer que de simplement stocker des composants dans l'entité.