Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: laghengar on November 15, 2008, 10:45:56 AM

Title: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on November 15, 2008, 10:45:56 AM
Bueno va, como veo que voy a necesitar ayuda de vez en cuando por problemas que tienen las funciones conmigo o no se que cosxa  ???, creo que es mejor que cree un post para mi solo  ;D, así no hay abiertos 20 posts o más  >:(. Bueno, estoy con otro problema. Amos a vé

[code language="bennu"]
process criatura(padre,tipo)
public
x_dest;
y_dest;
x_region;
y_region;

private
seleccionado;
ente ente_padre;//la variable padre de process criatura(padre,tipo) no es más que un sustitutivo de ente_padre para poder pillar la id del ente que queremos tener enlazado

begin
ctype=c_scroll;

ente_padre=padre;
file=ente_padre.fpg_criaturas;
graph=tipo+1;

x=ente_padre.x;
y=ente_padre.y;
x_dest=ente_padre.punto_encuentro.x;
y_dest=ente_padre.punto_encuentro.y;
get_point(grafico_interface,1,1,offset x_region,offset y_region);
say("punto region"+x_region+","+y_region);
loop

if(x<x_dest)
   x++;
   end
if(x>x_dest)
   x--;
   end
if(y<y_dest)
   y++;
   end
if(y>y_dest)
   y--;
   end
if(seleccionado==0)
   if(click_izq==1)
      if(collision(type mouse))
         seleccionado=1;
         end
      end
   end      
if(seleccionado==1)
   if(click_izq==1)
      if(not collision(type mouse))
         seleccionado=0;
         end
      end
   if(click_der==1)
      x_dest=mouse.x+scroll[0].x0-x_region;
      y_dest=mouse.y+scroll[0].y0-y_region;
      end
   end
frame;
end
end

[/code]

Grafico_interface es globa, el gráfico 1 existe, igual que su punto de control 1, totalmente observado con "fpg_edit" que dice que el punto de control 1 de dicho gráfico está en (31,31). Sin embargo, comprobando con say (gracias a splinter he aprendido a usarlo con variables  :D) x_region y y_region son = 0;

why????  :o. Ese es el fallo real del otro post que puse con que no conseguía poner el punto de control del grafíco de la criatura donde yo quería, el método que puse anteriormente en el otro post funciona realmente, el fallo lo tengo de la optención de este punto de control del grafico 1 en grafico_interface. En fin. Un saludo  :P
Title: Re: WIP "Evo"
Post by: TYCO on November 15, 2008, 02:56:33 PM
A primera vista veo esto:
.....
file=ente_padre.fpg_criaturas;
graph=tipo+1;
.....
get_point(grafico_interface,1,1,offset x_region,offset y_region);

El proceso usa un FILE y un GRAPH distinto del que recupera el GET_POINT, esto es correcto???
Title: Re: WIP "Evo"
Post by: laghengar on November 15, 2008, 04:43:39 PM
Pues creo que si está bien  ???
Title: Re: WIP "Evo"
Post by: TYCO on November 15, 2008, 06:04:26 PM
Me refiero a que si estas recuperando el "punto de control" 1 del gráfico deseado... o lo estas recuperando de otro que no es.
Title: Re: WIP "Evo"
Post by: laghengar on November 16, 2008, 02:57:39 PM
Es del que yo quiero.   ???
Title: Re: WIP "Evo"
Post by: TYCO on November 16, 2008, 07:48:33 PM
A ver XD:

file=ente_padre.fpg_criaturas;
graph=tipo+1;
.....
get_point(grafico_interface,1,1,offset x_region,offset y_region);

Estas usando un gráfico distinto del que recuperas el punto de control 1.
---------------------------------------------------------------------
Yo uso funciones como get_point sin ningún problema así:
...
// RECUPERAR PUNTOS DE CONTROL DE LA CARRERA ACTUAL (PUESTOS DE SALIDA, CHECK_POINTS, ETC)
For (contador=0;contador<100;contador++)
    get_point(fpg_carrera,100,contador,OFFSET x_[contador],OFFSET y_[contador]);
End

Y recupero los puntos sin problemas en esas variables Globales.

Tu problema no será que las tienes como PUBLIC??? y desde otro proceso intentas usarlas y te da 0???
De todas formas no se si tendrás algún problema haciendo hago mal con el tipo de dato ENTE.

Hazte un código sencillo fuera de tu juego para que veas como funciona get_point, porque seguro hago estas mezclando o haciendo mal.
Title: Re: WIP "Evo"
Post by: laghengar on November 16, 2008, 10:21:51 PM
OK
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 14, 2008, 05:58:41 PM
Hola de nuevo, una pregunta, ¿Hay algún problema a la hora de usar el path_find?, yo me estoy encontrando con algunos, como que parece que en principio comienza desde el 0,0, y ahora no se que le pasa que todos los procesos van al 0,0 y no salen de ahí, en fin, yo estoy revisando el código para ver si averiguo que pasa, hasta luego.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 14, 2008, 06:43:36 PM
Bueno, estoy casi seguro que esto es un fallo de bennu, pero antes de hablar demasiado quisiera preguntar, si ustedes han usado la función path_find y que os habeis encontrado???

Veran, yo tengo este proceso:

[code language="bennu"]process criatura(padre,tipo)
public

//variables que determinan el siguiente pixel de dureza a conseguir para llegar al pixel de dureza destino
x_paso;
y_paso;

//variables que determinan el pixel de dureza objetivo que se quiere llegar tras los pixels de paso
x_dest;
y_dest;
//variables inutilizables ya que get_point no lo consigo hacer trabajar en condiciones: x _region, y_region;

private
seleccionado;
ente ente_padre;//la variable padre de process criatura(padre,tipo) no es más que un sustitutivo de ente_padre para poder pillar la id del ente que queremos tener enlazado

begin

//establecer el proceso en las coordenadas del scroll
ctype=c_scroll;

//obtener los datos del ente_padre con sus fpgs y coordenadas
ente_padre=padre;
file=ente_padre.fpg_criaturas;
graph=tipo+1;
size=50;

//empezamos colocando el proceso en las coordenadas scrool del ente_padre
x=ente_padre.x;
y=ente_padre.y;

//poner como punto de destino del proceso en las coordenadas proporcionales respecto al mapa de durezas , escala=10 => pixel de pantalla / pixel de dureza

x_dest=(ente_padre.punto_encuentro.x)/escala;
y_dest=(ente_padre.punto_encuentro.y)/escala;

//linea que no trabaja en condiciones: get_point(grafico_interface,1,1,offset x_region,offset y_region);

loop
//estas dos líneas vacian el contenido de las durezas para evitar que se quede el punto marcado como bloqueado
casilla[x/escala][y/escala]=0;
map_put_pixel(fpg_dureza,2,x/escala,y/escala,0);

//condicional para determinar si las coordenadas scroll del proceso son las coordenadas pixel de destino que se busca, en caso contrario, se busca el camino para llegar a destino

//se multiplica por escala ya que el pixel destino es 1/10 del pixel del scrool, escala=10 => pixel de pantalla / pixel de dureza
if(not x==x_dest*escala and not y==y_dest*escala)
   path_find(fpg_dureza,1,x/escala,y/escala,x_dest,y_dest,0);

//tras obtener el camino llevar los valores de x e y de la durez a las variables de paso para que el proceso sepa el siguiente paso del camino
   path_getxy(offset x_paso,offset y_paso);

   end

//llevar al proceso a la casilla de paso teniendo en cuenta la escala, escala=10 => pixel de pantalla / pixel de dureza   
if(x<x_paso*escala)
   x++;
   end
if(x>x_paso*escala)
   x--;
   end
if(y<y_paso*escala)
   y++;
   end
if(y>y_paso*escala)
   y--;
   end

//marcar la casilla donde está posicionado el proceso como casilla bloqueada   
casilla[x/escala][y/escala]=id;
map_put_pixel(fpg_dureza,2,x/escala,y/escala,1);

//comportamiento del proceso cuando no está seleccionado
if(seleccionado==0)

//si se ha hecho un click_izq sobre el proceso, este se activa con la variable seleccionado en 1
   if(click_izq==1)
      if(collision(type mouse))
         seleccionado=1;
         end
      end
   end      

//comportamiento del proceso cuando está seleccionado
if(seleccionado==1)
//si se hace un click_izq fuera del proceso, esté se automarcará como no seleccionado, seleccionado=0
   if(click_izq==1)
      if(not collision(type mouse))
         seleccionado=0;
         end
      end

//si se hace click_der las coordenadas del ratón se determinarán como coordenadas de destino, el 31 es la posición, tanto en x como en y, de la esquina de la ventana de la región a la que está dentro el scroll   
//también hay que tener en cuenta la escala para pasarlo a los pixeles de dureza, escala=10 => pixel de pantalla / pixel de dureza
   if(click_der==1)
       x_dest=(mouse.x+scroll[0].x0-31)/escala;
       y_dest=(mouse.y+scroll[0].y0-31)/escala;
      end
   end
frame;

end
end[/code]

el caso es que se va al 0,0 y no sale de ahí. En este código se ve como usa la función path_find en cada frame, lo he tenido que poner así ya que tengo la impresión de que path_find solo guarda 1 camino, esto es un problema cuando se tienen varios procesos a la vez ya que al final todos acaban obteniendo el mismo camino aún habiéndole dado a cada uno un destino diferente. Bueno esta es la exposición a mi problema aunque ahora mismo se me está ocurriendo como podría salvarlo... seguiré contando, un saludo.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: SplinterGU on December 14, 2008, 07:53:24 PM
ni idea.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 27, 2008, 07:45:17 PM
Nada, no se que puñetas pasa con el path_find y el path_getxy, me he tenido que crear la función que adjunto al texto, y no hay manera, el 0,0 como primer paso del camino sigue inalterable, incluso poniendo el condicional para que ignorara todos los pasos que condujeran al 0,0 ha sido insuficiente, todo el resto funciona, pero al iniciarse el proceso original que busca el camino comienza yéndose al 0,0. En fin, acá envio la función guarda_camino y adjunto el trabajo realizado hasta ahora.

[code language="bennu"]
function guarda_camino(byte n)//n, 0 ó 1, determina si se quiere ignorar el primer paso del camino conseguido en path_find
private

byte paso;
criatura padre;
xbasura,ybasura;

begin
say("guarda_camino iniciado");

padre=father;
padre.n_pasos=0;


if(n==1)//método para eliminar el primer paso si n = 1
   say("filtrado iniciado");
   repeat
   path_getxy(offset xbasura, offset ybasura);
   until(not xbasura==0 or not ybasura==0)
   paso++;
   padre.camino[paso][0]=xbasura;
   padre.camino[paso][1]=ybasura;
   padre.n_pasos++;
   end   

repeat

paso++;
path_getxy(offset padre.camino[paso][0],offset padre.camino[paso][1]);
padre.n_pasos++;
until(padre.camino[paso][0]==padre.x_dest and padre.camino[paso][1]==padre.y_dest)
frame;
say("guarda_camino terminado");
end
[/code]

PD. realizado bajo bennu 15.c, acabo de pensar que es posible que el fallo sea en la creación del proceso, que por alguna causa altera el primer paso del camino.

PD2 feliz navidad y prospero año nuevo, otra vez  ;D un saludo

Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 27, 2008, 08:43:41 PM
Bueno, pues tampoco, he creado un repeat en el proceso que busca el camino, para que ignore todos los pasos que llevan al 0,0 y nada, sigue igual, hasta estoy pensando que este caso sea el típico, "por una tontería". En fin, quiero que se arregle esto como regalo de reyes  ;D.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: Prg on December 28, 2008, 01:05:55 AM
:)
la función path find es un poco complicada la primera vez que se usa. mira mi código quizá te sirva de algo:

http://forum.bennugd.org/index.php?action=dlattach;topic=386.0;attach=177 (http://forum.bennugd.org/index.php?action=dlattach;topic=386.0;attach=177)

verás. La función path find es una única función, que trabaja de forma global, si llamas path find en un proseso y luego en otro y en otro y luego path_getxy lo que va a hacer es darte la ruta en todos los procesos del último path find, o algo así. lo que tienes que hacer es guardar todos los puntos en un array para luego utilizarlos. permíteme y te hago un ejemplo. arriba hay un ejemplo que hice para hola, pero ahorita te hago uno a tí. :)
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 28, 2008, 01:11:00 AM
Gracias prg, pero creo que no has entendido mi problema. En fin, gracias de nuevo y seguiré a ver. Un saludo

Ahora creo qeu el fallo es mio, en algún lugar, modifico el camino, revisaré a ver.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 28, 2008, 01:21:13 AM
Esto es desconcertante, ahora de pronto todo mi código es irracional, en fin, cantaré villancicos
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: Prg on December 28, 2008, 01:47:33 AM
:) bueno, ya tengo el ejemplo. aquí está. quizá no entienda el problema... es mucho qué leer, je je je, pero el ejemplo es de varios procesos utilizando path find a la vez, pruébalo, nada pierdes.

recomendaciones.
1 si la distancia entre los puntos es mayor a 350, siempre te dará 0, ese es tu caso? , no genera camino en distancias muy grandes, yo utilizo get_distx y get_disty para acercar el camino, pero ten cuidado porque

2 si el punto de destino o el de inicio está en color blanco, se traba bennu.

3 prueba mi código, son 3 procesos a la vez, estoy seguro que te dará tips.

son todas mis recomendaciones :) este es un código distinco al de hola. :) nos vemos en 3 días, y no te desesperes, yo así estaba hace meses, la función está bien, sólo eso de las distancias me desespera, pero puedes hacer mapas a escala para que la distancia sea mayor, y sólo hay que dividir coordenadas. espero esto sí te sirva. suerte!!!

____________________________________

ahorita que recuerdo mientras preparaba el ejemplo de hola me encontré con algo parecido a lo que te sucedió. pero no recuerdo qué pasaba. creo que era algo de los bucles, o algo de la forma de llamar a path find, lo que me pasaba era que el pecesito se iba a la ezquina superior izquierda y no se movía, me tardé un poco y me tocó revisar el test de ejemplo del bennu, copié el típico bucle de while (get_...) y acomo´de algo por ahí y después de eso todo funcionó perfectamente, no recuerdo qué moví, bueno, el ejemplo que te doy está funcionando y eso es lo importante.

paht find regresa siempre primero el punto x e y del que se llamó, si esperas que te dé algo para hacer x++ o y++ entonces no funcionará, llámala mínimo 2 veces para que te de un punto distinto a las coordenadas de tu monito :) .
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 28, 2008, 12:41:16 PM
Hola   ;D, verás te hago un resumen  8), he modificado la función guarda_camino, ahora lo único que hace es que revisa el camino paso a paso con path_getxy y lo guarda en un array byte camino[90][1] (estoy pensando si no será por declararlo como byte) es una variable del proceso criatura.

Bien, empiezo desde el principio, el proceso criatura llama a path_find, y se pone como paso=0 y n_pasos=0, estas variables paso es para que el proceso no se pierda durante el camino, empieza por el paso 1 y sigue hasta n_pasos. Bien, luego llama a guarda_camino, la función guarda todos los path_getxy en el array byte camino[90][1] en forma de camino[paso][x,y] (0=x, 1=y) a cada bucle aumenta n_pasos del proceso criatura (la variable paso que modifica la función es privada, así que no altera el funcionamiento del camino para el proceso criatura), cuando el último path_getxy coincide con el destino la función finaliza y vuelva al proceso criatura, esta devuelve los valores de camino[paso][x,y] a las variables x_paso, y_paso cada vez que la criatura llega al paso previo (osea, los que indican paso a paso), tras devolver los valores revisa que ninguno sea el 0,0 en ese caso vuelve a volcar valores de camino.[code language="bennu"]if (x==x_paso*escala and y==y_paso*escala and paso<n_pasos)
   repeat
      paso++;
      x_paso=camino[paso][0];
      y_paso=camino[paso][1];
      until((x_paso!=0 or y_paso!=0))
   end[/code]

Bueno, pues no ha sido suficiente, me siguen haciendo lo del 0,0. De todas formas, me he dado cuenta que este método no vale para tiempo real, tengo que hacer que revise el camino en cada frame, lo cual ya cambia la cosa, cambiaré a 005 guardando este código ya que creo que sirve para algo, bien, gracias y un saludo.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 28, 2008, 12:47:38 PM
Bien, creo que ya he encontrado mi fallo, estupidez al canto, lo dicho, if (x==x_paso*escala and y==y_paso*escala and paso<n_pasos) ahí está, esta línea es para comprobar si el proceso criatura ha llegado a x_paso, y paso, si no ha llegado sigue el paso hasta alcanzarlo, el problema es que siempre se inicializa a 0,0, y yo me lo he estado comiendo con papas todo este tiempo, maldita mi descendencia , que locura ,  ;D
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on December 28, 2008, 01:09:00 PM
Ole, ya está, ya no van al 0,0 les puedo hacer que formen un muro y otro que esquive el muro, ahora va como me gusta, aunque he visto que si le doy como coordenada destino uno que está ocupado por otro, va y se apunta ese destino también, en fin, miraré a ver como arreglo esto. Gracias prg, tus comentarios me han ayudado

Feliz año nuevo  ;D
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: Prg on December 30, 2008, 07:14:40 PM
:) Me alegro que te haya podido ayudar. :) Suerte. y también ¡feliz año nuevo! :)
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: Windgate on February 26, 2009, 06:04:44 PM
lol

He descargado y probado el jueguecito, con ese mapa de durezas tan ENORME es normal que path_find no sea capaz de resolver ciertas distancias. Piensa que en cualquier juego de estrategia, el mapa real tiene asociado un mapa de "casillas" muchísimo más pequeño, donde están las durezas a interpretar.

En cualquier caso, estoy haciendo ahora mismo pruebas con path_find, y extrañamente no es capa de resolverme mapas de durezas de 16x16 pixels. Me parece extraño, ¿Puede ser por el mod_path.DLL que lo tengo anticuado?

Por cierto, también tengo un mod_pathfind.DLL, ¿Alguien sabe para qué sirve o si aporta algo mejor? Gracias amiguitos!!!
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: SplinterGU on February 26, 2009, 06:26:44 PM
probablemente el mod_pathfind.dll es una version vieja, posiblemente de la wip2... no lo se...
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on February 26, 2009, 09:09:54 PM
Enorme???, si es de 100x100, no se, a lo mejor es enorme...

Bueno he dejado un zip con el trabajo realizado hasta ahora, no te recomiendo mirarlo mucho ya que tiene algún defecto y está apartado por mi parte.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: Windgate on February 28, 2009, 07:55:17 PM
Laghengar, tendrás que disculparme, creo que confundí tu juego con otra descarga, ya he posteado en su respectivo hilo lo que te he dicho por error... (A veces me pongo a leer los posts demasiado rápido)

He bajado tu última versión (Gracias!), y además de poder desplazarme por el escenario lleno de "bichitos" no veo donde está la búsqueda de caminos, ¿Puedes darme alguna instrucción de cómo se "juega"? He mirado el código y sólo responde a la tecla Esc, y clicando con el ratón no consigo nada.

Algo raro me ocurre además, veo que cargas un fpg con un gráfico para el mouse pero no veo el mouse por ningún sitio, no es el primer juego con el que me pasa, no creo que sea problema de las DLL, tengo las últimas versiones.

Cuéntame amigo, estoy ansioso por ver pruebas de path_find, sean como sean. Y gracias por tu aporte.
Title: Re: WIP "Evo" (estrategia en tiempo real)
Post by: laghengar on March 02, 2009, 09:44:54 PM
Perdona, ahora mismo no te puedo ofrecer de mucha ayuda (ando liado con otro tema), bueno te digo que éste código si responde antes los clicks de ratón. Cuando se carga el mapa verás una cosa que va dando vueltas, si le haces click en la bola del centro aparece otra bola abajo a la derecha (similar a cuando clicas en un edificio de crear unidades en los populares juegos de estrategia), después haces click en la bola de abajo y entonces aparece la bola en el mapa que se situa en una posición determinada por código. Puedes crear cuantas bolas te apetezcan y manéjalos como se buscan los caminos, pero te aconsejo que no crees mucho ya que he comprobado que los procesos se vuelven locos cuando uno se entorpece con el otro, pero esto solo ocurre en un número mayor de 10 procesos.

bueno, supongo que no lo disfrutarás mucho, sin embargo espero impulsarte a crear cosas por el estilo. Un saludo.