Se traba con Path_find

Started by Outlaw, September 28, 2010, 11:52:56 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind


SplinterGU

lo comente y funciona...

ahora voy a releer porque no se me cae la aplicacion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

bien, tenes varios errores...

1) no tenes que usar rgb(0,0,0) para el color, sino simplemente 0, con esto podes corregirlo

  fichero1=Load_fpg("elmitoprueba.fpg");

for ( i = 0; i < 1080; i++ )
for ( ii = 0; ii < 810; ii++ )
    if ( map_get_pixel(fichero1, 48, i,ii ) == rgb(0,0,0) )
        map_put_pixel( fichero1, 48, i, ii, 0 );
    end
end
end
save_fpg(fichero1,"elmitoprueba.fpg");

2) en el momento del path_find estas mezclando advance con path_find con angle, tenes que usar un solo metodo, si usas path_find no uses advance ni angle con respecto al personaje sino que tenes que hacer get_angle con respecto al resultado del path_getxy.

para una idea de por donde tenes que apuntar, aca modifique tu codigo para que veas como deberias encarar la cosa, esto no es la solucion, solo para mostrarte como funciona el path_find


Process Enemigo_dispara(graph,velocidad,x,y,x2,y2,x3,y3,x4,y4,x5,y5)
Private
  disparado;
  x_original,y_original;
  velocidad_original;
  waypoint;
  x1,y1;
  ang_hasta_prota;
  usado=0;
  Lo_ve;
  byte hay_camino;
  int path_x,path_y;
Begin
  ctype=c_scroll;  // a la variable ctype le doy el valor para que este dentro del scroll
  x_original=x;
  y_original=y;
  velocidad_original=velocidad;
  waypoint=1;

Loop
/*
  ang_hasta_prota=Get_angle(id_prota);

  Switch(waypoint)
    Case 1:
      angle=Fget_angle(x,y,x2,y2);
        If (Fget_dist(x,y,x2,y2) < velocidad)
          x=x2;
          y=y2;
        Else
          Advance(velocidad);
        End
        If (x == x2 and y == y2) waypoint++; End
    End
    Case 2:
      angle=Fget_angle(x,y,x3,y3);
        If (Fget_dist(x,y,x3,y3) < velocidad)
          x=x3;
          y=y3;
        Else
          Advance(velocidad);
        End
      If (x == x3 and y == y3) waypoint++; End
    End
    Case 3:
      angle=Fget_angle(x,y,x4,y4);
        If (Fget_dist(x,y,x4,y4) < velocidad)
          x=x4;
          y=y4;
        Else
          Advance(velocidad);
        End
      If (x == x4 and y == y4) waypoint++; End
    End
    Case 4:
      angle=Fget_angle(x,y,x5,y5);
      If (Fget_dist(x,y,x5,y5) < velocidad)
          x=x5;
          y=y5;
        Else
          Advance(velocidad);
        End
      If (x == x5 and y == y5) waypoint++; End
    End
    Case 5:
      angle=Fget_angle(x,y,x_original,y_original);
      If (Fget_dist(x,y,x_original,y_original) < velocidad)
          x=x_original;
          y=y_original;
        Else
          Advance(velocidad);
        End
        If (x == x_original and y == y_original) waypoint=1; End
    End
  End
                            // 400                                                              // 400

    If ((get_dist(id_prota) < 10 and angle + 45000 <= ang_hasta_prota) or (get_dist(id_prota) < 10 and angle - 45000 <= ang_hasta_prota)) // ahora si OK!! lo ve!!
      Repeat
        If (usado == 0)
          Lo_ve=Que_ve(x,y);
          usado=1;
        End
        If (Lo_ve == true)
          velocidad=0;
      angle=get_angle(id_prota);
      If (get_dist(id_prota) < 300)
                If (disparado == false)
          disp_enem(x,y,angle);
          disparado=true;
        End
      End
      If (disparado == true)
          tiempo+=1;
          End
          If (tiempo == 30)
            disparado=false;
            tiempo=0;
          End
*/
          If (get_dist(id_prota) > 1)
            velocidad=velocidad_original;
            hay_camino=path_find(fichero1,48,x/2,y/2,id_prota.x/2,id_prota.y/2,0);
              If (hay_camino == 1)
//                If (MAP_GET_PIXEL(fichero1,48,x/2,y/2) and MAP_GET_PIXEL(fichero1,48,id_prota.x/2,id_prota.y/2))
                WHILE (path_getxy(&path_x, &path_y))
                  x =path_x * 2; // le puse 2 pq el mapa de caminos esta a la mitad del mapa donde camina el prota
                  y =path_y * 2;
  //xadvance(fget_angle(x=path_x*2,y=path_y*2,id_prota.x,id_prota.y),velocidad);
                  Frame;
                END
//              End
            End
            Frame;
          End

          If (collision(type disparo) or collision(type golpe))
    exp+=10;
    return;
  End
/*
        End
  Frame; // este frame va porq como entra en un bucle del bucle pierde al frame de afuera
  Until (get_dist(id_prota) > 400)
End
*/
If (collision(type disparo) or collision(type golpe))
  exp+=10;
  return;
End

  Frame;
End // end if
End
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Prg

#18
lo había bajado, pero no vi el gráfico así que no le metí mano.

lo del rgb ya se lo había dicho al compañero, supongo que se le pasó.

Quotelo color 0 y rgb(0,0,0) son distintos. cero significa que no hay color, rgb(0,0,0) retorna el color con rojo=0, verde=0 y azul=0 pero con alpha de 255  y se usa para colocar colores invisibles pero que colisiona. si quieres 0 usa rgba(0,0,0,0), pero te recomiendo mejor un


   
   
[code language="bennu"]#define sncam 0
if (MAP_GET_PIXEL(fichero1,48,x/2,y/2) == sncam  and MAP_GET_PIXEL(fichero1,48,id_prota.x/2,id_prota.y/2) == sncam )

[/code]

Quote from: Outlaw on September 30, 2010, 02:35:22 AM
sncam...nunca lo habia visto... :P...gracias! aunque sigue sin seguir al prota, pero bueno, seguire investigando!  ;)

perdón por no explicar. sncam es una constante que defino como cero, porque como te dice splinter no debes usar rgb(0,0,0)



en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

#19
Quote from: SplinterGU on September 30, 2010, 09:46:13 PM
falta el busca.prg

A que "busca.prg" te referis Splinter?
Más allá de eso, mil gracias en serio por tomarte tu tiempo para ayudarme!

Prg, gracias tambien!

Edito: después de mucho probar y probar sigue sacandome del programa y vuelvo al notepad++, no se que sera, tal vez es mi maquina? es todo un misterio...en teoria deberia funcionar!
"Life is cheap when the bounty is high"

Prg

Quote from: Outlaw on October 01, 2010, 12:20:17 AM
Quote from: SplinterGU on September 30, 2010, 09:46:13 PM
falta el busca.prg

A que "busca.prg" te referis Splinter?
Más allá de eso, mil gracias en serio por tomarte tu tiempo para ayudarme!

Prg, gracias tambien!

Edito: después de mucho probar y probar sigue sacandome del programa y vuelvo al notepad++, no se que sera, tal vez es mi maquina? es todo un misterio...en teoria deberia funcionar!


ok. no te traumes. ::)

pasame el codigo y todos los archivos graficos y los revisaré minuciosamente para ver qué puede ser.  :)

¿ya probaste lo que te dijo splinter?
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

Ok, te paso el .prg, supongo que el resto de las partes (fpg, fnt) lo tenes del link que deje...Fijate que curioso en el proceso enemigo_dispara, que es por el cual viene la consulta, dejo solo el bucle del path_find y el prg ni siquiera se inicia, es decir, algo grave me esta pasando con ese path_find...es muy raro no?
"Life is cheap when the bounty is high"

SplinterGU

a mi se me salio un par de veces, pero no se cuando pasa, y me parece que no tiene que ver con el path_find, las veces que se me salio no dio ningun error, pareciera como que es la logica de tu programa, quizas energia del personaje, no se, no revise el codigo, asi que si no tenes nada de eso puede ser algun error, lo raro es que no tenga ningun mensaje.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Voy a seguir revisando el codigo... :P
"Life is cheap when the bounty is high"

Prg

el mapa de caminos me da valores muy raros, posiblemente sea ese el problema. lo revisaré pero podré hacerlo hasta dentro de 26 horas. de todas formas, lo que encuentre te lo comento. saludos.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Prg

bien, solucionado.

el problema es el mapa de caminos. el color donde se transita es 0, no negro -16777216. la forma más sencilla de lograr el cero es usando gráficos de 8 bits, así que la solución es lo que te había comentado con anterioridad de map_get_pixel y un mapa de caminos correcto.

adjunto fpg de 8 bits con el mapa y código solucionado.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

Prg la verdad debo decirte muchisimas gracias!! estaba que no podia encontrar el problema, el asunto es que yo no habia entendido que el mapa de caminos lo tenia que guardar en un fpg distinto de 8 bits, separado del resto! cuando pasaba los mapas de camino a 8 bits y luego los volvia a poner en el pfg de 32 me preguntaba quie pasaba, y era que obviamente convierte todos los mapas con la profundidad que tenia, 32 bits! Van karmas bien merecidos!!!  :) :) :) (gracias por tu ayuda aunque suene repetitivo)
"Life is cheap when the bounty is high"

SplinterGU

Quote from: Prg on October 03, 2010, 03:42:51 AM
bien, solucionado.

el problema es el mapa de caminos. el color donde se transita es 0, no negro -16777216. la forma más sencilla de lograr el cero es usando gráficos de 8 bits, así que la solución es lo que te había comentado con anterioridad de map_get_pixel y un mapa de caminos correcto.

adjunto fpg de 8 bits con el mapa y código solucionado.

se nota que ni leyeron mis respuestas, me mate usando tiempo al pedo... gracias!!!!

http://forum.bennugd.org/index.php?topic=1674.msg29289#msg29289
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#28
Quote from: SplinterGU on September 30, 2010, 10:32:28 PM
bien, tenes varios errores...

1) no tenes que usar rgb(0,0,0) para el color, sino simplemente 0, con esto podes corregirlo

 fichero1=Load_fpg("elmitoprueba.fpg");

for ( i = 0; i < 1080; i++ )
for ( ii = 0; ii < 810; ii++ )
   if ( map_get_pixel(fichero1, 48, i,ii ) == rgb(0,0,0) )
       map_put_pixel( fichero1, 48, i, ii, 0 );
   end
end
end
save_fpg(fichero1,"elmitoprueba.fpg");


2) en el momento del path_find estas mezclando advance con path_find con angle, tenes que usar un solo metodo, si usas path_find no uses advance ni angle con respecto al personaje sino que tenes que hacer get_angle con respecto al resultado del path_getxy.

para una idea de por donde tenes que apuntar, aca modifique tu codigo para que veas como deberias encarar la cosa, esto no es la solucion, solo para mostrarte como funciona el path_find


Process Enemigo_dispara(graph,velocidad,x,y,x2,y2,x3,y3,x4,y4,x5,y5)
Private
 disparado;
 x_original,y_original;
 velocidad_original;
 waypoint;
 x1,y1;
 ang_hasta_prota;
 usado=0;
 Lo_ve;
 byte hay_camino;
 int path_x,path_y;
Begin
 ctype=c_scroll;  // a la variable ctype le doy el valor para que este dentro del scroll
 x_original=x;
 y_original=y;
 velocidad_original=velocidad;
 waypoint=1;

Loop
/*
 ang_hasta_prota=Get_angle(id_prota);

 Switch(waypoint)
   Case 1:
     angle=Fget_angle(x,y,x2,y2);
       If (Fget_dist(x,y,x2,y2) < velocidad)
         x=x2;
         y=y2;
       Else
         Advance(velocidad);
       End
       If (x == x2 and y == y2) waypoint++; End
   End
   Case 2:
     angle=Fget_angle(x,y,x3,y3);
       If (Fget_dist(x,y,x3,y3) < velocidad)
         x=x3;
         y=y3;
       Else
         Advance(velocidad);
       End
     If (x == x3 and y == y3) waypoint++; End
   End
   Case 3:
     angle=Fget_angle(x,y,x4,y4);
       If (Fget_dist(x,y,x4,y4) < velocidad)
         x=x4;
         y=y4;
       Else
         Advance(velocidad);
       End
     If (x == x4 and y == y4) waypoint++; End
   End
   Case 4:
     angle=Fget_angle(x,y,x5,y5);
     If (Fget_dist(x,y,x5,y5) < velocidad)
         x=x5;
         y=y5;
       Else
         Advance(velocidad);
       End
     If (x == x5 and y == y5) waypoint++; End
   End
   Case 5:
     angle=Fget_angle(x,y,x_original,y_original);
     If (Fget_dist(x,y,x_original,y_original) < velocidad)
         x=x_original;
         y=y_original;
       Else
         Advance(velocidad);
       End
       If (x == x_original and y == y_original) waypoint=1; End
   End
 End
                           // 400                                                              // 400

   If ((get_dist(id_prota) < 10 and angle + 45000 <= ang_hasta_prota) or (get_dist(id_prota) < 10 and angle - 45000 <= ang_hasta_prota)) // ahora si OK!! lo ve!!
     Repeat
       If (usado == 0)
         Lo_ve=Que_ve(x,y);
         usado=1;
       End
       If (Lo_ve == true)
         velocidad=0;
     angle=get_angle(id_prota);
     If (get_dist(id_prota) < 300)
               If (disparado == false)
         disp_enem(x,y,angle);
         disparado=true;
       End
     End
     If (disparado == true)
         tiempo+=1;
         End
         If (tiempo == 30)
           disparado=false;
           tiempo=0;
         End
*/
         If (get_dist(id_prota) > 1)
           velocidad=velocidad_original;
           hay_camino=path_find(fichero1,48,x/2,y/2,id_prota.x/2,id_prota.y/2,0);
             If (hay_camino == 1)
//                If (MAP_GET_PIXEL(fichero1,48,x/2,y/2) and MAP_GET_PIXEL(fichero1,48,id_prota.x/2,id_prota.y/2))
               WHILE (path_getxy(&path_x, &path_y))
                 x =path_x * 2; // le puse 2 pq el mapa de caminos esta a la mitad del mapa donde camina el prota
                 y =path_y * 2;
 //xadvance(fget_angle(x=path_x*2,y=path_y*2,id_prota.x,id_prota.y),velocidad);
                 Frame;
               END
//              End
           End
           Frame;
         End

         If (collision(type disparo) or collision(type golpe))
   exp+=10;
   return;
 End
/*
       End
 Frame; // este frame va porq como entra en un bucle del bucle pierde al frame de afuera
 Until (get_dist(id_prota) > 400)
End
*/
If (collision(type disparo) or collision(type golpe))
 exp+=10;
 return;
End

 Frame;
End // end if
End

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

Gracias Splinter Tambien!!!!!!!!! La cosa es que de tu explicación, lo que era mas facil poner era que debia guardar el mapa de caminos en un fpg diferente con formato de 8 bits, en cambio vos me pusiste una funcion para que pintara el grafico de un color a otro, es decir convertirlo, cosa que yo no entendia su utilidad del todo. Va karma para vos tambien por tu ayuda, y no te enojes es solo que prg hizo una explicacion (la ante ultima que dio) para dummies y ahi recien entendi...el tema es que las diferencias entre un div-like y otro son bastantes, en este caso del path_find son profundas, cuesta cambiar la manera de pensar entre uno y otro, y disculpen que sea tan duro para entender!
"Life is cheap when the bounty is high"