path_find()

path_find(<modo>, <fichero>, <gráfico>, <tamaño casilla>, <x>, <y>, <OFFSET estructura>, <sizeof(estructura)>)

Retorna:

Número de puntos de la ruta, o 0 si no se encontró ninguna.

Descripción:

Busca una ruta desde las coordenadas actuales del proceso hasta un punto determinado, sorteando los obstáculos definidos en un mapa de búsqueda (en el manual de usuario se puede encontrar información sobre estos mapas).

El modo.

Se puede realizar la búsqueda de diferente forma, según el <modo> indicado como primer parámetro de la función.

  0 - Búsqueda menos precisa y más rápida.
  1 - Búsqueda más precisa, pero más lenta.

El mapa de búsqueda.

Los códigos de <fichero> y <gráfico> se refieren al mapa de búsqueda. Este es una versión reducida del decorado real, donde se aparecen en color negro (el número 0 de la paleta) las zonas libres y con color blanco los obstáculos del mismo.

Como <tamaño casilla> se indica el factor de reducción del mapa de búsqueda, es decir, por cuanto se tendrían que multiplicar el ancho y alto del mismo para mostrarse a tamaño real. Por ejemplo, si para una pantalla de 320x200 se genera un mapa de búsqueda de 160x100, entonces el tamaño de casilla será 2.

Los puntos de la ruta.

A continuación se deben indicar las coordenadas <x> e <y> hacia las que debe dirigirse el proceso (se toma como origen de la ruta las coordenadas actuales del proceso que ejecute la función path_find()).

Esta función retorna una serie de puntos en una estructura, estos son los puntos que conforman la ruta desde el origen hasta el punto destino.

Por ello se debe declarar una estructura que contenga dos campos (x,y), y tantos registros como puntos puedan conformar la ruta calculada.

A la función se le debe pasar, como los dos últimos parámetros, la dirección (OFFSET) de esta estructura y su tamaño (SIZEOF()), de forma que pueda devolver el resultado en la misma.


Programa ejemplo:
PROGRAM ejemplo_path_find;

GLOBAL
    num_puntos;
    STRUCT puntos[100]
      x,y;
    END
    índice;

BEGIN
    load_fpg("help\help.fpg");
    put_screen(0, 7);
    graph=200;
    mouse.graph=200;
    LOOP

        // Obtiene la ruta hasta las coordenadas del ratón

        num_puntos=path_find(0,0,201,2,mouse.x,mouse.y,OFFSET puntos,sizeof(puntos));

        // Si se obtuvo una ruta, se muestra y se avanza hasta el destino

        IF (num_puntos>0)
            FOR (índice=0;índice<num_puntos-1;índice++)
                draw(1,24,15,0,puntos[índice].x,puntos[índice].y,puntos[índice+1].x,puntos[índice+1].y);
            END
            IF (fget_dist(x,y,puntos[0].x,puntos[0].y)>4)
                xadvance(fget_angle(x,y,puntos[0].x,puntos[0].y),4);
            ELSE
                x=puntos[0].x;
                y=puntos[0].y;
            END
            draw(1,24,15,0,x,y,puntos[0].x,puntos[0].y);
        END

        FRAME;
        delete_draw(all_drawing);
    END
END


En este ejemplo se utiliza el gráfico número 7 del fichero help.fpg como decorado, y el gráfico número 201 del mismo como su mapa de búsqueda.

El tamaño de las casillas en el mapa de búsqueda es 2

El proceso principal está continuamente obteniendo una ruta hasta el puntero del ratón con la función path_find().

Los diferentes segmentos de esta ruta se representas con líneas utilizando la función draw(), y el incremento de las coordenadas se realiza con la función xadvance().

Para obtener la distancia y el ángulo hacia el siguiente punto de la ruta se utilizan las funciones fget_dist() y fget_angle().


Para ver si se puede ir directamente en línea recta entre dos puntos (sin atravesar ningún obstáculo) se puede utilizar la función path_line().

La función path_free() determina si un punto determinado del mapa es un obstáculo o si es un punto libre (accesible).


Ver: path_line() - path_free()