Actuellement, je suis confronté au problème suivant:
J'essaie d'écrire un clone de pong en utilisant un système de composants d'entité (ECS). J'ai écrit le "framework" tout seul. Il existe donc une classe qui gère les entités avec tous les composants. Ensuite, il y a les classes de composants elles-mêmes. Et enfin, il y a mes systèmes qui obtiennent juste toutes les entités qui ont des composants dont le système a besoin.
Ainsi, par exemple, mon système de mouvement recherche toutes les entités qui ont un composant de position et un composant de mouvement. Le composant de position tient juste la position et le composant de mouvement tient la vitesse.
Mais le vrai problème est mon système de collision. Cette classe est comme un blob logique. J'ai tellement de cas particuliers dans cette classe.
Par exemple: Mes pagaies peuvent entrer en collision avec les bordures. Si cela se produit, leur vitesse est réglée sur zéro. Ma balle peut aussi bien entrer en collision avec les bordures. Mais dans ce cas, sa vitesse est simplement reflétée à la normale de la frontière afin qu'elle se reflète. Pour ce faire, j'ai donné au ballon une composante physique supplémentaire qui dit simplement: "Hé, cette chose ne s'arrête pas, elle réfléchit." Donc, en fait, le composant physique n'a pas de données réelles. Il s'agit d'une classe vide qui est juste là pour indiquer au système si un objet se reflète ou s'arrête.
Ensuite, il y a ceci: je veux rendre quelques particules lorsque la balle entre en collision avec les pagaies ou les bordures. Je pense donc que la balle doit obtenir un autre composant qui indique au système de collision de créer des particules lors de la collision.
Ensuite, je veux avoir des power-ups qui peuvent entrer en collision avec les pagaies mais pas avec les bordures. Si cela se produit, les power-ups doivent disparaître. J'aurais donc besoin de beaucoup plus de boîtiers et de composants (pour dire au système que certaines entités ne peuvent entrer en collision qu'avec certaines autres, pas avec tous même si d'autres sont réellement capables de se heurter, en outre, le système de collision a dû appliquer les power-ups à les pagaies, etc., etc., etc.).
Je vois que le système de composants d'entité est une bonne chose car il est flexible et vous n'avez pas de problèmes d'héritage. Mais je suis totalement bloqué actuellement.
Suis-je trop compliqué? Comment dois-je faire face à ce problème?
Bien sûr, je dois créer des systèmes qui sont en fait responsables de la "post-collision", donc le système de collision ne dit que "Oui, nous avons une collision dans la dernière image" et puis il y a un tas de systèmes "post-collision" qui tous nécessitent des composants (combinaisons de) différents, puis changent les composants. Par exemple, il y aurait un système de mouvement post-collision qui arrête les choses qui doivent s'arrêter lorsque la collision se produit. Puis un système physique post-collision qui reflète les choses, etc.
Mais cela ne me semble pas non plus être une bonne solution, car par exemple:
- Mon système de post-collision de mouvement aurait besoin d'entités qui ont un composant de position, un composant de mouvement et un composant de collision. Ensuite, il mettrait la vitesse de l'entité à zéro.
- Le système physique post-collision aurait besoin d'entités qui ont un composant position, un composant mouvement, un composant collision et un composant physique. Il refléterait alors le vecteur vitesse.
Le problème est évident: le mouvement post-collision a besoin d'entités qui sont un sous-ensemble des entités du système physique post-collision. Ainsi, deux systèmes post-collision fonctionneraient sur les mêmes données, l'effet étant: Bien qu'une entité ait une composante physique, sa vitesse serait nulle après une collision.
Comment ces problèmes sont-ils résolus en général dans un système de composants d'entité? Ces problèmes sont-ils même habituels ou est-ce que je fais quelque chose de mal? Si oui, que faut-il faire et comment?