Actualmente estoy enfrentando el siguiente problema:
Estoy tratando de escribir un clon pong utilizando un sistema de componentes de entidad (ECS). Escribí el "marco" todo por mí mismo. Entonces hay una clase que administra las entidades con todos los componentes. Luego están las clases de componentes en sí. Y por último, están mis sistemas que solo obtienen todas las entidades que tienen componentes que el sistema necesita.
Entonces, por ejemplo, mi sistema de movimiento busca todas las entidades que tienen un componente de posición y un componente de movimiento. El componente de posición solo mantiene la posición y el componente de movimiento mantiene la velocidad.
Pero el problema real es mi sistema de colisión. Esta clase es como un blob lógico. Tengo muchos casos especiales en esta clase.
Por ejemplo: mis paletas pueden chocar con los bordes. Si esto sucede, su velocidad se establece en cero. Mi pelota también puede chocar con los bordes. Pero en este caso, su velocidad se refleja en la normalidad del borde, por lo que se refleja. Para hacer esto, le di a la pelota un componente de física adicional que simplemente dice: "Oye, esto no se detiene, se refleja". Entonces, en realidad, el componente de física no tiene datos reales. Es una clase vacía que está ahí para decirle al sistema si un objeto se refleja o se detiene.
Luego viene esto: quiero renderizar algunas partículas cuando la pelota colisiona con las paletas o los bordes. Así que creo que la pelota tiene que obtener otro componente que le dice al sistema de colisión que cree partículas en la colisión.
Entonces quiero tener potenciadores que pueden chocar con las paletas pero no con los bordes. Si eso sucede, los power-ups tienen que desaparecer. Por lo tanto, necesitaría muchos más casos y componentes (para decirle al sistema que algunas entidades solo pueden colisionar con ciertas otras, pero no con todas, incluso si algunas otras realmente pueden colisionar, además, el sistema de colisión tuvo que aplicar los poderes para las paletas, etc., etc., etc.).
Veo que el sistema de componentes de la entidad es bueno porque es flexible y no tiene problemas con la herencia. Pero estoy totalmente atrapado actualmente.
¿Estoy pensando demasiado complicado? ¿Cómo debo hacer frente a este problema?
Claro, tengo que crear sistemas que sean realmente responsables de la "colisión posterior", por lo que el sistema de colisión solo dice "Sí, tenemos una colisión en el último fotograma" y luego hay un montón de sistemas de "colisión posterior" que todos requieren diferentes (combinaciones de) componentes y luego cambian los componentes. Por ejemplo, habría un sistema de movimiento posterior a la colisión que detiene las cosas que deben detenerse cuando ocurre la colisión. Luego, un sistema de física posterior a la colisión que refleja las cosas, etc.
Pero tampoco parece ser una solución adecuada para mí porque, por ejemplo:
- Mi sistema de movimiento posterior a la colisión necesitaría entidades que tengan un componente de posición, un componente de movimiento y un componente de colisión. Entonces establecería la velocidad de la entidad a cero.
- El sistema de física posterior a la colisión necesitaría entidades que tengan un componente de posición, un componente de movimiento, un componente de colisión y un componente de física. Entonces reflejaría el vector de velocidad.
El problema es obvio: el movimiento posterior a la colisión necesita entidades que son un subconjunto de las entidades en el sistema de física posterior a la colisión. Por lo tanto, dos sistemas posteriores a la colisión operarían con los mismos datos, siendo el efecto: aunque una entidad tiene un componente físico, su velocidad sería cero después de una colisión.
¿Cómo se resuelven estos problemas en general en un sistema de componentes de entidad? ¿Son esos problemas habituales o estoy haciendo algo mal? En caso afirmativo, ¿qué y cómo se debe hacer en su lugar?