Programadores => Inteligencia Artificial => Mensaje iniciado por: Sr_Rodilla en 22 de Febrero de 2014, 01:20:33 am

Título: Problemas con las esquinas en A*
Publicado por: Sr_Rodilla en 22 de Febrero de 2014, 01:20:33 am
Buenasss, he implementado un algoritmo A* para un juegecito Flash que estoy haciendo, y funcionar funciona, pero tengo un problema:

Uso casillas de 50x50 pixeles, y el enemigo tiene un hitbox de ese tamaño, el punto que uso para calcular a que nodo pertenece el enemigo, es el punto central de su hitbox, en plan x += 25, y += 25. Ahora bien, el problema es que al perseguir al personaje, si llega a una esquina se piensa que esta en el nodo de abajo, y puede pasar al nodo de la derecha, pero en realidad una parte de su hitbox choca con el obstáculo, impidiéndole que pase, por lo que se queda atascado, pongo un esquema para que se entienda mejor:

(http://nsae01.casimages.net/img/2014/02/22/140222011955177320.png)

Tengo una forma de solucionarlo, que consiste en reducir el hitbox para que no choque, o no controlar las colisiones, pero en ese caso se ve al enemigo por encima del obstáculo y queda muy mal...

También he intentado suavizar el camino aumentado las casillas de obstáculo, pero en ese caso, termina quedándose dentro de una de esas casillas y se bloquea del todo...

¿Alguna solución?
Título: Re:Problemas con las esquinas en A*
Publicado por: Sr_Rodilla en 22 de Febrero de 2014, 04:05:36 am
Me autorespondo porqué ya he encontrado la solución:

Es muy simple, ahora uso dos variables para guardar el movimiento, derecha y arriba (nombres de las variables, una para cada eje), de tal forma que al ir a la derecha pongo la variable derecha = true, y al ir a la izquierda pongo derecha = false. Lo mismo con la variable arriba, pero para el eje y.

Luego cada vez que me muevo, compruebo si se a movido, usando otra booleana que declaro como false y si muevo la paso a true, si la variable es false (no se ha movido) entonces sigo avanzando en la dirección en que estaba avanzando.Por ejemplo, si derecha = true, voy hacia la derecha, si arriba = false, voy hacia abajo.

De esta manera, y con el ejemplo de antes, en vez de quedarse parado, seguiría bajando hasta que el obstáculo no le molestara, y pudiera avanzar hacia la derecha.