Estoy desarrollando un pequeño motor de juego en 2D. Los personajes tienen un método de pintura que actualmente hace lo siguiente:
- Calcule la nueva posición del personaje según su velocidad, etc.
- Actualice la celda de la cuadrícula de colisión **
- Dibuja el personaje en la nueva posición
** He creado una cuadrícula de colisión para reducir el número de controles de intersección.
Ahora el algoritmo básico que he pensado para detectar la colisión es:
For Each Character
Check intersection with characters in surrounding 8 cells
Simplemente puedo colocar este código en el método de pintura. Pero aquí está el problema que anticipo.
Supongamos que dos caracteres A y B se encuentran en celdas adyacentes en la cuadrícula de colisión. Ahora, según el algoritmo anterior en la iteración del carácter A, detectará que ha chocado con B. En la iteración para el carácter B, detectará que ha chocado con A.
Pero tengo una idea de que cuando A detecta que ha chocado con B, debería informarle a B que ha chocado con A. Esto ahorraría muchas comparaciones cuando hay más de 2 actores colisionando. Pero no estoy seguro de cómo manejar esto. Creo que en lugar de que cada personaje verifique su colisión, debería verificar la colisión dentro del bucle del juego.
¿Sería correcto este enfoque? ¿Cómo has manejado este tipo de problema? Pensé en la rejilla de colisión yo mismo. ¿Hay alguna alternativa a la lógica de cuadrícula de colisión?
Respuestas:
El enfoque habitual para la detección de colisiones es no hacer que A o B detecten colisiones por su cuenta.
En su lugar, primero mueve todos los objetos, luego hace que un sistema de colisión separado busque colisiones entre todos los pares de objetos, informando a cada objeto sobre las cosas con las que ha chocado, y finalmente renderiza todos los objetos.
Entonces, en esencia, en lugar de hacer "mover, verificar colisiones, dibujar" dentro de su función Paint (), divide "mover" y "dibujar" en funciones separadas que llama por separado (primero "mover" para cada objeto, luego "dibujar" para cada objeto). Y entre ellos, verifique las colisiones.
Nota avanzada: si alguno de sus objetos se mueve en reacción a las colisiones detectadas, es posible que deba repetir el paso "buscar colisiones entre todos los pares de objetos", en caso de que la respuesta de colisión de un objeto provoque otra colisión.
fuente
Ejecuto un bucle para todos mis personajes en el bucle del juego como tú dices.
La forma en que lo hago es con un estado en cada uno de mis personajes, por lo que si A y B chocan mientras A verifica la colisión, A y B están configurados para golpear. Al comienzo del bucle de B, comprueba si ya se ha alcanzado, si es así, id no ejecuta el bucle.
Puse el código de efecto en el bucle para que cualquier acción que se debe tomar en B haya sucedido en el bucle de A, por lo que no debería haber ninguna razón para que B lo verifique, ya que esto podría estropear el resultado de la colisión, aunque esto puede ser diferente para usted .
fuente