Tratando de entender cómo manejar adecuadamente la colisión en un juego diseñado alrededor de componentes.
Veo que muchos ejemplos tienen algún tipo de PhysicsComponent
que se agrega a la lista de componentes de la entidad, pero la implementación real me confunde.
Para que esto funcione, PhysicsComponent
necesitarían acceso al mundo que lo rodea. Esto no tiene sentido intuitivo para mí. ¿No debería un componente desconocer no solo su contenedor (la entidad), sino el contenedor de su contenedor (el mundo)?
Para mí, parece que el nivel o la escena deben mantener una lista de estas entidades y cada actualización del juego, recorrer las entidades para determinar qué colisión.
Mi pregunta es, en primer lugar, si este es un buen diseño o no, y en segundo lugar, cómo determinar qué entidades pueden colisionar. Supongo que las entidades sólidas podrían implementar una interfaz IRigidBody vacía para que el nivel pueda determinar qué entidades en la lista admiten colisión. ¿Pero esto está rompiendo el diseño del componente?
En cambio, ¿deberían contener un componente RigidBody vacío? En realidad, esto puede ser mejor porque no siempre está vacío y este enfoque es más a prueba de futuro. El único problema con esto es la complejidad. La escena tendría que recorrer no solo todas las entidades, sino también los componentes de cada entidad para determinar si tenía este componente RigidBody.
En tercer lugar, cuando chocan, ambas entidades deberían ser informadas de alguna manera y tampoco estoy seguro de cómo lograr esto.
Digamos que ambas entidades contenían un HealthComponent y cuando colisionaban, sus dos estados de salud disminuían en algún valor arbitrario. 5. ¿Supongo que sería responsabilidad de la escena manejar esto cuando detecta una colisión entre dos entidades?
¿Pero entonces la escena es responsable de demasiado? Pude ver que esto posiblemente se salga de control y se vuelva difícil de manejar cuando la escena sea responsable de muchas cosas a las que las entidades no deberían (?) Tener acceso.
Editar: Pregunta actualizada con más detalles.