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.

Outlaw

Hola a todos! Ya he leido varios posts del path_find y su uso, hasta de algunos errores comunes que pueden aparecer, el asunto es que a mi se me congela el juego y me tira un error de windows "bgdi ha detectado un problema y debe cerrarse", puede ser ocasionado por memoria, porque a nivel de sintaxis esta bien, el asunto tambien es que corrobore la cosa usando primero un mapa de caminos de 1bit y otro de 8 bits y con los dos me paso lo mismo (zona transitable color 0 -negro- y obstaculos color 255,255,255 -blanco- ). Este es el pedazo de codigo donde esta implementada la funcion:

(Dentro del proceso "enemigo_dispara" en la linea 323)

If ((get_dist(id_prota) < 200 and angle + 45000 <= ang_hasta_prota) or (get_dist(id_prota) < 200 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
         
          While (get_dist(id_prota) > 200) <<<<<<<<<<<<<<<<<<<<<<<<<< BUCLE DEL ERROR
            velocidad=velocidad_original;
    hay_camino=path_find(fichero1,48,x,y,id_prota.x,id_prota.y,0);
    If (hay_camino == 1)
       WHILE (path_getxy(&a, &b))
                  x =a * 2; // le puse 2 pq el mapa de caminos esta a la mitad del mapa donde camina el prota
                  y =b * 2;
                  frame;
            END
              //xadvance(get_angle(id_prota),velocidad);
              //advance(velocidad); 
            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


Este es el codigo de error:
AppName: bgdi.exe    AppVer: 1.0.0.1    ModName: mod_path.dll
ModVer: 0.0.0.0    Offset: 000011ee

Adjunto el programa completo para que vean como funciona. Saludos y gracias! :)
Edito: no me da el tamaño de attachment para subir el fpg, pesa 6 mb
"Life is cheap when the bounty is high"

Prg

Esto sucede porque le pides a la funcion que vaya a un lugar que no se puede debido a que el punto destino está sobre el color blanco, al menos amí me sucedía por esta razón.

Aquí tengo un ejemplo de uso
http://forum.bennugd.org/index.php?topic=392.0

puedes evitar el problema verificando el color antes de llamar la funcion path_find, ejemplo:
if (map_get_pixel(fichero,gráfico,x1/escala,y1/escala)==0)


pd: El error no sucede si no se puede acceder pero el destino está en el color negro
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

Gracias Prg por responder!
Agregue lo que me dijiste a la condicion:


While (get_dist(id_prota) > 200)
    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 and MAP_GET_PIXEL(fichero1,48,x/2,y/2) == 0) // MAP_GET_PIXEL AGREGADO
       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;
            frame;
        END
    End
    Frame; 
End 


Pero sigue pasando lo mismo, es mas, he comprobado que el destino este en el color negro (color=0)...Asi que no se que puede ser...
Por cierto, ya habia utilizado anteriormente la funcion que hiciste vos, me parecio genial! pero no andaba y queria irme a lo basico para entender este path_find...saludos!
"Life is cheap when the bounty is high"

Prg

Quote from: Outlaw on September 29, 2010, 03:19:32 AM
Gracias Prg por responder!
Agregue lo que me dijiste a la condicion:


While (get_dist(id_prota) > 200)
   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 and MAP_GET_PIXEL(fichero1,48,x/2,y/2) == 0) // MAP_GET_PIXEL AGREGADO
      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;
           frame;
       END
   End
   Frame;  
End  


Pero sigue pasando lo mismo, es mas, he comprobado que el destino este en el color negro (color=0)...Asi que no se que puede ser...
Por cierto, ya habia utilizado anteriormente la funcion que hiciste vos, me parecio genial! pero no andaba y queria irme a lo basico para entender este path_find...saludos!


ahm. lo que pasa es que el mapgetpixel va acá:

[code language="bennu"]
While (get_dist(id_prota) > 200)
   velocidad=velocidad_original;
   if (MAP_GET_PIXEL(fichero1,48,x/2,y/2) == 0 and MAP_GET_PIXEL(fichero1,48,id_prota.x/2,id_prota.y/2) == 0)
   hay_camino=path_find(fichero1,48,x/2,y/2,id_prota.x/2,id_prota.y/2,0);
   If (hay_camino == 1) // MAP_GET_PIXEL AGREGADO
      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;
           frame;
       END
   End
   end
   Frame;  
End  
[/code]
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

Prg gracias por tu paciencia! Ya se que paresco tonto pero bue! jajaja! El tema es que hice todo como e dijiste vos, comprendiendo todo. Cosa curiosa que pasa es que cuando cambio el color 0, a color_librepaso=rgb(0,0,0) se tilda, no tira error sino que me devuelve al escritorio...y ademas estoy casi seguro que no entra en el bucle While(get_dist(id_prota) > 200) fijate que le puse esto adentro para comprobar (esto de comprobarlo con el color en 0 no con la var color_librepaso):


If (hay_camino == 1)
                Write(fuente1,400,400,4,"¡¡funciona!!"); <<<-----------  
                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;
                  Frame;
                END
              End

"Life is cheap when the bounty is high"

Prg

#5
Quote from: Outlaw on September 30, 2010, 12:56:00 AM
Prg gracias por tu paciencia! Ya se que paresco tonto pero bue! jajaja! El tema es que hice todo como e dijiste vos, comprendiendo todo. Cosa curiosa que pasa es que cuando cambio el color 0, a color_librepaso=rgb(0,0,0) se tilda, no tira error sino que me devuelve al escritorio...y ademas estoy casi seguro que no entra en el bucle While(get_dist(id_prota) > 200) fijate que le puse esto adentro para comprobar (esto de comprobarlo con el color en 0 no con la var color_librepaso):


If (hay_camino == 1)
               Write(fuente1,400,400,4,"¡¡funciona!!"); <<<-----------  
               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;
                 Frame;
               END
             End



no te preocupes:)

el 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]
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Outlaw

sncam...nunca lo habia visto... :P...gracias! aunque sigue sin seguir al prota, pero bueno, seguire investigando!  ;)
"Life is cheap when the bounty is high"

SplinterGU

mmm... quizas puede ser el tamaño del mapa... prg, probaste el ejemplo?

de que tamaño es el mapa que usas? lo podes adjuntar?

todavia no he visto el codigo que adjuntaste, ahora lo chequeo.

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

Outlaw

Compañeros, aca lo subi a rapidshare: http://rapidshare.com/files/422341317/ElMitoV020.rar
Esta el .prg, el .fpg y las dos .fnt
Mil gracias por su ayuda!
"Life is cheap when the bounty is high"

SplinterGU

maldito rapidshare y maldito speedy... tengo problemas de conexion, fallan las conexiones tcp (no la conexion adsl) y se cago gusto cuando tenia que hacer el download, asi que perdi la descarga, ahora tengo que esperar 15 minutos.

podrias pasarmelo por mail o subirlo a megaupload?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Splinter quiere pipas :)
Yo ya lo tengo  ;)

Outlaw

Que raro yo nunca tuve problemas Splinter!  ::) dame tu mail por mp y te lo mando!
"Life is cheap when the bounty is high"

SplinterGU

mi mail no es problema...

splintergu@bennugd.org

decia por megaupload porque tengo una cuenta premium y no tengo esperas, asi que reintentar no me preocupa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Outlaw

"Life is cheap when the bounty is high"

SplinterGU

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