problema con Path_getxy

Started by Outlaw, October 17, 2010, 04:53:17 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Outlaw

Hola a todos, paso a comentarles mi problema, usando Path_getxy para obtener los puntos hacia donde el proceso debe moverse, persiguiendo al prota, me encuentro con que dos procesos con distinto "modus operandi" reciben las mismas coordenadas de la funcion mencionada (respectivamente enemigo_dispara y enemigo_persigue) los dos utilizan variables privadas. El codigo de la busqueda es el mismo de siempre, que de hecho funciona correctamente pero el problema esta en path_getxy y tal vez el puntero sea el problema...

            ...
            hay_camino=path_find(fpg_dur,1,x/2,y/2,id_prota.x/2,id_prota.y/2,0);
            If (hay_camino == 1)   
                While (path_getxy(&path_x_dispara, &path_y_dispara))
                  x =path_x_dispara * 2;
                  y =path_y_dispara * 2;
                  Frame;
                End               
            End     
            ...     


El codigo lo pongo para que vean que no cometo errores en ese sentido, de hecho enemigo_dispara y enemigo_persigue tiene us propios juegos de variables donde guardan las coordenadas obtenidas con path_getxy respectivamente y son de tipo entero: path_x_dispara, path_y_dispara...path_x_persigue,path_y_persigue. Pareciera que apunta a una y se la devuelve TAMBIEN al otro, es decir, me aparecen de repente un enemigo_dispara con las coordenadas de seguimiento de enemigo_persigue, los dos juntos recorriendo lo mismo, siendo que uno y el otro estan en dos lugares alejados entre si, puede ser que tenga algo que ver con los punteros y la direccion sea la misma direccion de memoria a la que apuntan?
"Life is cheap when the bounty is high"

SplinterGU

la funcion path_find tiene un solo arreglo interno de resultado, si vos queres que varios procesos hagan uso de la path_find entonces vas a tener que llamar a la path_find, y luego cargar todo el vector resultado con path_getxy en memoria y luego usarlo frame a frame.

resumiendo, si 2 procesos llaman a la misma funcion, se pisan entre si el resultado.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Ok Splinter, entiendo, entonces cual seria la mejor solucion para eso? Tener un solo proceso enemigo que use path_find? Yo creo que lo ideal en mi caso por lo menos, seria que el vector que usa path_find internamente se pueda o se tenga que declarar por el usuario y de esa manera cada proceso podria tener el propio guardado con sus resultados "personales"
"Life is cheap when the bounty is high"

SplinterGU

#3
tenes que recuperar el vector completo antes de hacer frame, luego lo mejorare.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Ok, lo solucione asi por ahora (si es que lo vas a arreglar mejor  ;D)



While (path_getxy(&path_x_persigue[p], &path_y_persigue[p]))
                x =path_x_persigue[p] * 2;
                y =path_y_persigue[p] * 2;  
If (not(p == 100))
  p++;
Else
  p=0;
End
                Frame;
              End     



"Life is cheap when the bounty is high"

SplinterGU

arreglar no, porque no es algo que funcione mal, sino que es una limitante... tendre que agregar nueva funcionalidad opcional...

pero esa es la idea que yo te decia... que lo recojas una vez resuelto.

estuve viendo tambien el algoritmo de path_find del juego aquaria, no se que tan rapido es, pero si veo que se traba cada tanto, asi que no se si es buena eleccion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Creo que lo ideal sería buscar los escalada, profundidad, anchura y A* y tenerlos todos disponibles. Mejor implementación que los "oficiales" no puede haber.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Outlaw

Quote from: Windgate on October 17, 2010, 09:59:47 PM
Creo que lo ideal sería buscar los escalada, profundidad, anchura y A* y tenerlos todos disponibles. Mejor implementación que los "oficiales" no puede haber.

Muy cierto! Seria excelente tener uno que otro para elegir, porque por ejemplo el actual trabaja en 8 direcciones, y eso para ciertos juegos no queda muy realista...eso si antes que me lo digan estoy investigando sobre el tema y si lo tengo que hacer en bennu (el algoritmo de path_find) pues lo hare!  ;)
"Life is cheap when the bounty is high"

SplinterGU

no, como ya dije antes, el actual trabaja en 8 o en 4 direcciones, segun setees el flag, ya te lo documente en el otro hilo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Si Splinter es lo que dije que trabaja en 8, se que segun el flag "no_diag" o algo asi trabajaria en 4 tambien, lo que queria decir es esto: que algunas veces estaria bueno que se puedan mover en mas de 8 direcciones para recorrer el mapa, eso nada mas...
"Life is cheap when the bounty is high"

SplinterGU

ajap, y como seria mas de 8 direcciones? pensa que en un cuadro de 3x3 (pixel central y sus pixels adyascentes) solo hay 8 direcciones, no veo como puede existir mas direcciones, por el momento no se pueden usar 1/2 pixel.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Tenes toda la razon, me deje llevar por el path_find de gemix que funciona distinto al de bennu, en ese recorre la pantalla con la orden advance y con un angulo, posibilitando asi que paresca que se maneja por ej. en 32 direcciones, porque como decis vos, no puede haber mas de 8 siendo que se divide el mapa en nodos cuadrados...o en pixels y son cuadrados...en fin! saludos!
"Life is cheap when the bounty is high"

SplinterGU

bueno, pero eso tiene simple solucion, si como imagino en tu mapa de mascara de path cada pixel representa varios pixels en el mapa real, entonces solo tenes que hacer el correspondiente get_angle y advance entre cada valor de devuelto del getxy.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Eso mismo pensaba yo. Es imposible que con un mapa que represente pixel a pixel el mapa real hacer una línea perfecta entre dos puntos en diagonal, ni bennu ni g...mix ni nadie :D, rompería las leyes de la informática al intentar posicionarse en medios píxeles :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/