Más diversión con un ES ...
Actualmente, tengo algunos sistemas:
- Renderizador (atributo renderizable, atributo Transformar)
- Movimiento (atributo móvil, atributo de transformación, atributo renderizable [para cuadros delimitadores, etc.])
- Entrada (atributo InputReceiver)
- etc.
Estoy agregando detección de colisión. Lo primero que pensé fue agregar un nuevo sistema que realizara la colisión. Tiene sentido para mí mantener esta aislado del Motionsistema, ya que no todas las cosas que se mueven o están animadas necesariamente participar en la detección de colisiones - cámaras, niebla, etc - pero parece que Collisiony Motionson interdependientes.
Cuando Motionmueve una entidad, la transformación debe validarse Collisiony el movimiento puede cancelarse o ajustarse (rebotar, detenerse en una pared, etc.).
Una alternativa sería crear un atributo Collidable que mantenga una referencia a un objeto de colisión: kd-tree, octree, etc., que se comparte entre entidades que pueden colisionar entre sí. El Motionsistema sería a continuación, comprobar para ese atributo, y lo utilizan para comprobar o ajustar el movimiento.
Desde la perspectiva del código, esa es una solución aceptable. Sin embargo, desde el punto de vista de la arquitectura ECS, parece que está empujando la lógica al Motionsistema que no se aplica a todas las entidades que tienen un Movableatributo.
También podría almacenar un vector de movimiento en el Movableatributo, y hacer que el Collidersistema se ajuste Transformsegún sea necesario, pero eso implicará duplicar la funcionalidad entre Motiony Collider, o una devolución de llamada de Collidera Motioncon algunos datos sobre la ubicación de la colisión y los datos de superficie para rebote / reflexión, etc. .
Esto puede caer bajo el encabezado de "pirateo de casos especiales", pero me gustaría obtener información de aquellos que han manejado esto antes sin crear una tonelada de código de caso de borde.
La pregunta ¿Cuál es una buena manera de evitar un acoplamiento estrecho entre los sistemas de movimiento y colisión cuando parece que requieren conocimiento mutuo?