- louk,
Salut !
J'ai commencé un premier essai de l'exercice Javaquarium en Java pour appliqur l'ECS mais je suis arrivé à un hic.
D'abord, je vais définir ma vision de l'ECS (je me suis assez longuement documenté mais je ne l'ai encore jamais appliqué) :
- une entité est une liste de composants qui la définissent;
- un composant est une propriété, comme la façon de se reproduire ou le régime de l'entité;
- un système est ce qui gère une entité (ça doit être là que j'ai un problème, je ne sais pas trop comment le définir en fait).
À propos de l'entité, je sais qu'on peut la considérer comme un id, point. Ensuite, couplé au pattern Pool, on optimise énormément grâce à une limitation des Cache Miss. Mais dans les langages Java, C#, Python ou je n'sais quoi, c'est automatisé (d'après un pote) et donc pas besoin de s'en préoccuper.
Et d'un point de vue concept, je préfère la définition : une entité est une liste de composants qui la définissent. Ensuite, les systèmes n'agissent sur telle ou telle entité que si elle a les composants adéquats.
Concrètement : les systèmes représentent les comportements, les composants les caractéristiques/propriétés d'une entité et l'entité un poisson ou une algue, pour l'instant. Plus tard, je m'amuserais bien à ajouter d'autres type d'animaux, des objets non vivants comme du bois (enfin, non vivant, vous voyez c'que j'veux dire) ou un caillou etc…
Pour l'instant, j'avais dans l'idée de faire 3 types de systèmes : ComportementReproducteur, ComportementAlimentaire, ComportementVieillesse (pour les poissons, une perte de pv, le contraire pour les algues) avec par exemple différents composant de reproduction (hermaphrodite, hétérosexuel, sexe changeant avec le temps), d'alimentation (carnivore, herbivore) et de vieillesse (vie de poisson, vie d'algue). Mais ce doit être une mauvaise voix car ça ne fonctionne pas :
Imaginons une entité qui contient le composant HermaphroditeOpportuniste. Le système ComportementReproducteur doit comprendre qu'il s'agit d'une entité hermaphrodite opportuniste.
1er hic : dans le système ComportementReproducteur, je ne vois pas comment faire autrement qu'avec une série de conditions pour faire reproduire l'entité en fonction de son composant de reproduction (ici HermaphroditeOpportuniste). Si j'ajoute un nouveau type de reproduction, j'ajoute une nouvelle condition avec le code correspondant dans la méthode evolve() (ou update(), ou compute(), fin bref, nommez-là comme vous voulez). On ne peut donc pas vraiment ajouter un nouveau type de reproduction de façon simple et efficace.
2e hic : si j'utilise une suite de condition (ou un switch()), j'aurais la logique de tous les différents type de reproduction dans une seule et même méthode et donc un seul système. Je casse complètement la logique de l'ECS.
Je dois avoir un problème dans mon interprétation de l'ECS, peut-être arriverez-vous à m'éclairer.
La solution que j'ai prise pour l'instant est de contenir les systèmes (les comportements) dans l'entité et de ne pas utiliser de composants. Chaque entité contient donc une instance de ComportementReproducteur ou ComportementAlimentaire, par exemple. Ce qui est en fait le pattern Strategy décrit dans le tuto Java, mais j'aimerais réussir à appliquer un ECS complet. En fait, je m'entraine à l'ECS dans différents langages parce que j'aimerais créer un jeu de RTS civilisationnel (type AoE, quoi) et choisir le langage qui me correspondra le plus (à-priori le C++ avec SFML) que je commencerai de façon très simplifié. Pour ça, il faut que j'ai en tête une conception très modulaire et performante : je le modifierai encore probablement dans 5, 10, 20 ans (avec de grosses mises à jour lorsque le langage et les concepts évolueront) et donc devenir conséquent petit à petit.
EDIT : J'ai mis mon code sur GH mais je vais recommencer de zéro.