Hola a todos,
a ver si podeis ayudarme con este ejemplo, (podría valer como un ejemplo corto para el bennu pack).
necesito llegar desde un punto a otro por el camino más corto pero pasando por dentro de un área.
Actualmente voy por la recta que une a los dos puntos pero esta pasa por fuera del área delimitada.
Acepto sugerencias.
En el ejemplo adjunto todo lo necesario, al ejecutar debeis de dar click en la zona blanca de la derecha para ver lo que pasa actualmente. El área que delimita por donde debe moverse es la azul.
Saludos.
¿Dificil? 13 lo han leído y ni papa :D.
Debe ser facil para quien haya hecho juegos de estrategia en tiempo real o rpgs tipo diablo o aventuras gráficas tipo monkey island, ya que es el control básico :D. ¿Nadie?
A mi se me ocurre ir comprobando con "collision". Si estás colisionando con el área azul va correco y en caso negativo restamos o sumamos uno a la coordenada y. luego lo pruebo y eso.
porque no revisas mis ejemplos de path find?
http://forum.bennugd.org/index.php?topic=392.0 (http://forum.bennugd.org/index.php?topic=392.0)
deja y lo reviso y te doy mi opinión... para que no te sientas mal por no recibir respuestas XD :) (ya me ha pasado... je je je)
mm, ya lo revisé, y lo mejor ceo que es or path find, sólo necesitas crear un mapa de este tipo, será en 8 bits y con negro por don de podemos caminar y blanco por donde no.tal como el que viene en mi ejemplo.
saludos.
je je, ahí va mi ejemplo... me gustó cómo quedó, aunque me iba a poner a hacer los poderes del mi personaje 1 en el májico... ups, je je ej, me emocioné con esto.
Gracias, intentaba no usar path find ya que nunca me fue muy bien con ella.
Gracias a tu ejemplo y al post donde hablaste de ella, he descubierto que el png que tienes que pasarle tiene que ser un map de un bit, si le pasas otro de más bits no va muy casto no entiendo el motivo.
En el caso de este map de un bit pasa lo que comentabas, si seleccionas una zona blanca para ir se cuelga el programa al ejecutar path_find, esto tiene que ser un error fijo de la implementación de path_find, no tiene mucho sentido que sea a posta :D.
Con toda la información, he intentado simplificar el ejemplo para ir al grano, he parseado las funciones path_find y path_get para que funcionen mejor a la respuesta esperada.
Ahora al seleccionar en una zona no válida el jugador se acerca a la zona más cercana válida.
A ver que te parece.
De todas formas no se corregir el fallo , que hize a posta, de que hasta que no sueltes el mouse.left no responde el sonic quedándose parado.
Jo***, yo pensaba que te querías hacer una función parecido, si no te habría puesto yo también el path_find, es fácil solo que tienes que tener cuidado.
Estás en lo cierto, con las prisas se me saltó poner el no.
Buscaba,y busco, no usarlo.
Ya corregí el post anterior.
Quizas mire la implementación de path_find para ver qué es lo que hace :D y hacerlo yo en código bennu, ya veremos.
mmm,... si lo que quieres es no usar el path find, entonces tendras que buscar algoritmos de búsqueda de caminos, y mediante el map_buffer, o mediante map_get_pixel buscar en el mapa colores = 0 para pasar por esas rutas.
http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda_A* (http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda_A*)
bueno, pues a investigar... no lo crees? je ej je... suerte!
(http://upload.wikimedia.org/wikipedia/commons/thumb/f/f4/Pathfinding_A_Star.svg/430px-Pathfinding_A_Star.svg.png)
tu ejemplo de uso de path find funciona muy bien :)
Anda, viendo ahora ese gráfico comprendo porqué es tan importante el tamaño total del mapa. Pero ¿cómo sería si hubiese un muro que obligue rodearlo?
ahmm, bueno, pues la parte gris sería como un muro...
aunque en bennu no se cómo sea el algoritmo... :)
No, no me has entendido :D, me refiero a que exista un muro que te obligue a rodearlo más todavía
OOOOOOOXOOOOOO
OOOOOOOXOBOOOO
OOAOOOOXOOOOOO
OOOOOOOXXXXXXO
OOOOOOOOOOOOOO
Imaginemos que salimos de A y vamos a B, O son las areas libres y X las obstaculizadas. Perdonad que lo ponga tan cutre, pero es que no tengo tiempo de dibujarlo ;D
depende si buscas a lo ancho o a lo largo, pero una posible forma sería:
OOOOOOOXOOOOOO
OOOOOOOXOBOOOO
OOA1111XOO11111O
OOOOO01XXXXXX1
OOOOOO111111111O
Procedo a mirar tus ejemplos.
Yo hasta ahora había usado path_find, pero lógicamente el tamaño del mapa importa, com mapas de 48x48 pixels hice un laberinto en espiral (El peor de los casos) y no era capaz de resolverlo...
De hecho incluso propuse algunas mejoras para el algoritmo, pero a nivel verbal, todavía no he codeado nada relacionado con búsqueda de caminos con Bennu.
Lo dicho, vamos a ver que has hecho fenómeno xD
ja ja ja, en realidad yo nada amigo, le estaba diciendo a dcelso dónde puede encontrar información si quería hacer su propio algoritmo, pero eso es todo... XD saludos
Estaba viendo el algoritmo ese "a star", es complejo, he visto que hay un ejemplo de uso en c, a ver si lo puedo adaptar para bennu y lo pruebo. También vi que hay otro más lento pero más eficaz llamado dijkstra. De todas formas el arreglo del ejemplo ese que hice a path find va bien para mi propósito así que no le daré mucha urgencia.
El A* (A star) es de los buenos.
Hay muchos algoritmos similares, aunque la verdad Dijkstra nunca lo había oído orientado a un path_find ???
En el fondo se trata de pasar de cada celda a la siguiente y calcular la cercanía al objetivo, hay distintos métodos para alcanzar el objetivo, puedes declinarte por ir siempre a las celdas con un valor de cercanía más bajo, puedes tener en cuenta todas las celdas para garantizar una solución más óptima, etc.
La mayor complicación es que hay veces que llegas a "callejones sin salida" y tienes que continuar buscando desde otra celda anterior
Por supuesto es necesario mantener una "lista de celdas ya evaluadas" para evitar consultar 2 veces la misma celda.
Dicho "verblamente" suena muy bónito, pero programarlo cuesta un rato... Yo en su día lo programé con Lisp, un lenguaje lógico orientado a la inteligencia artificial, aunque es horrible... Programarlo con Bennu tiene que ser sin duda mucho más agradable xD
Si consigues algo interesante no dudes en informarnos eeeehhhh ::)