Estoy haciendo un juego de Tower Defense en Flash sin una ruta predefinida.
Aunque mi cuadrícula es 40x40 (¿pequeña?), A * tiene problemas cuando recalcula cada vez. Así que hice mi propia modificación para facilitar el recálculo y el recuento de células tocadas se redujo a alrededor de 900 (al modificar cerca de la raíz). Todavía se congela por un tiempo muy corto, pero detectable, cuando se coloca una nueva torre.
¿Es este un problema de implementación, o 40x40 es demasiado?
Editar:
La estructura de mi código:
- Todos los datos se guardan en una matriz 2D de celdas.
- Cada celda contiene su padre en la dirección de la ruta (1-8 en el sentido de las agujas del reloj) y la matriz codificada en bits de sus hijos en la ruta (cada bit representa un hijo).
- La búsqueda es realizada por A * con la estimación de la distancia euclidiana.
Respuestas:
No puedo comentar, pero el primer perfil en Flex, todo lo demás es una conjetura.
fuente
Supongo que TD es 'Tower Defense'
Creo que A * se está exagerando un poco por esto.
Al comienzo del juego, inunda el área del juego desde los puntos de salida para crear un mapa de movimiento:
y el movimiento es siempre hacia un cuadrado con un valor más bajo.
Cuando el jugador coloca una torre, actualice cada una de las ocho casillas adyacentes: para cada casilla, establezca su valor de movimiento en uno más que el valor adyacente más bajo. Si el valor cambia, repita el proceso centrado en el cuadrado actualizado. Luego, para verificar que la ruta a la salida no esté bloqueada, asegúrese de que todos los cuadrados estén adyacentes a un cuadrado de menor valor.
Cuando el jugador retira una torre, establece el valor del movimiento en uno más que el cuadrado adyacente más bajo y repite el proceso anterior.
Un enfoque más simple sería volver a hacer el relleno de inundación.
fuente
Extraño, pensé que había respondido a esto, pero la respuesta parece haberse ido. Haga que su algoritmo de búsqueda se pueda actualizar en varios pasos, de modo que cuando coloque una torre y reproduzca una animación, pueda hacer un poquito cada fotograma y tendrá entre medio segundo y un segundo para actualizar su A * sin una pausa notable. Es latencia: si no puedes acelerarlo, busca la forma de ocultarlo. Reproducir una animación mientras se coloca una torre sería natural para un juego y es un buen lugar para esconderlo.
fuente
Para empezar, podría cambiar su matriz a un vector, debería darle algunas mejoras de velocidad. Publique el código y podríamos sugerir más optimizaciones.
fuente
Supongo que su ralentización se debe a que está calculando una ruta para todos los personajes simultáneamente. Calcular un camino para un personaje es rápido, pero si hay dos docenas de personajes en la escena, eso puede empantanarse.
En su lugar, debe distribuir la carga en unos pocos fotogramas. Alterne sus actualizaciones de IA para que diferentes personajes actualicen su camino en diferentes marcos. Sería realmente notable si un personaje no reaccionara hasta un segundo después, pero solo un cuadro no va a causar malas reacciones.
fuente