Mi juego tiene muchos tipos diferentes de buenos y muchos tipos diferentes de malos. Todos dispararán proyectiles entre sí, pero no quiero que se produzca ningún daño colateral accidental para ninguna de las alineaciones. Entonces, los malos no deberían poder golpear / dañar a otros malos y los buenos no deberían poder golpear / dañar a otros buenos.
La forma en que estoy pensando en resolver esto es haciendo que la Unit
instancia (esto es javascript, por cierto), tenga una alignment
propiedad que puede ser good
o bad
. Y solo dejaré que ocurra la colisión si el
class Attack
boolean didAttackCollideWithTarget(target)
return attack.source.alignment != target.alignment and collisionDetected(attack.source, target)
Este es un pseudocódigo, por supuesto.
Pero hago esta pregunta porque tengo la sensación de que podría haber una forma mucho más elegante de diseñar esto además de agregar otra propiedad a mi Unit
clase.
Respuestas:
Filtro de colisión
Una situación más robusta que se escala en muchas capas es usar el filtrado, que no es lo mismo que agrupar.
Esto funciona mejor al dar a cada objeto 2 máscaras de bits .
Y solo desencadenará una colisión si lo siguiente es cierto.
Es más fácil establecer la máscara por defecto en 0xFFFF, lo que hace que choque con todo. Y por defecto la Categoría a 0x0001. los objetos colisionan con las categorías en la máscara de otros habrá una colisión.
Otra forma de pensarlo es que cada objeto tiene un tipo y una lista de todos los tipos con los que puede colisionar. Solo cuando dos objetos colisionan con los tipos entre sí, se produce una colisión. Podría tener el mismo comportamiento al tener una lista de enumeraciones en lugar de una máscara, pero una máscara en un orden de magnitud más rápido.
Escenario que describe
Me gusta aprovechar las enumeraciones en esta situación.
Entonces digamos que tenemos.
Bala disparada por un buen chico
Chicos buenos
Chicos malos
Lo que da como resultado lo siguiente cuando un disparo de bala de un buen tipo golpea a otro buen tipo.
Pero golpeará a los malos.
fuente
Tuve el mismo problema en mi proyecto actual (en Java). Después de un par de intentos se resuelve creando cuatro listas. Esta solución se creó en Java y para un juego 2D, pero también debería funcionar, de manera similar, en JavaScript
pseudocódigo
pseudocódigo, igual para la clase Bullets
Puede que esta no sea la mejor solución o la más rápida, pero lo ayudará en este momento. Lamento no poder darte una solución en JavaScript, pero espero poder ayudarte
Por cierto, mi inglés no es el mejor, pero espero que puedas seguir mi explicación
fuente