collision()

collision(<tipo de proceso>)

Retorna:

El código identificador de un proceso o 0.

Descripción:

Ésta es la función del lenguaje para detectar choques entre gráficos.

Comprueba si el proceso actual (el que ejecutó esta función) colisiona con uno del tipo indicado como parámetro. Es decir, comprueba si los gráficos de ambos procesos están, al menos, parcialmente superpuestos.

En caso de producirse una colisión devolverá el código identificador del proceso con el que está chocando el proceso actual. En caso contrario la función devolverá siempre 0.

Si el proceso actual colisiona con varios procesos del tipo que se ha especificado, la función collision() devolverá el resto de los identificadores en las sucesivas llamadas que se realicen a la misma.

Para obtener, de esta forma, todos los códigos identificadores de los procesos que colisionan con el actual no se debe utilizar la sentencia FRAME entre dos llamadas consecutivas a la sentencia collision(). En el caso de ejecutar un proceso una sentencia FRAME, esta función volverá a retornar todos los códigos identificadores de procesos colisionantes desde el primero.

Algo similar sucede si se ejecuta una llamada a la función especificando un tipo de proceso diferente; si tras esto se vuelven a detectar las colisiones con el tipo anterior, esta función también volverá a retornar todos los códigos desde el primero.

Cuando se quieren obtener los códigos identificadores de los procesos de un tipo determinado aunque no se produzca ninguna colisión con ellos, se debe llamar a la función get_id().

Si lo que se pretende es comprobar la cercanía entre dos procesos sin que necesariamente colisionen sus gráficos, entonces se deberá emplear la función get_dist().

Programa ejemplo:
PROGRAM ejemplo_collision;

PRIVATE
    id2;

BEGIN
    load_fpg("help\help.fpg");
    put_screen(0, 1);
    graph=100;
    x=160;
    y=100;
    proceso_móvil(80, 50, 101);
    LOOP
        delete_text(all_text);
        write(0, 160, 0, 1, "Use los cursores para mover el triángulo");

        id2 = collision(TYPE proceso_móvil); // Se detecta la colisión

        IF (id2<>0)
            write(0, 160, 200, 7, "¡ DETECTADA COLISION !");
        END
        FRAME;
    END
END

PROCESS proceso_móvil(x, y, graph);

BEGIN
    LOOP
        IF (key(_right)) angle-=10000; END
        IF (key(_left)) angle+=10000; END
        IF (key(_up)) advance(4); END
        FRAME;
    END
END


En este ejemplo se visualiza una pelota en el centro de la pantalla como gráfico del programa principal. Luego se crea un proceso de nombre proceso_móvil con el dibujo de un triángulo controlable con las teclas de los cursores.

El programa principal llamará a la función collision() para comprobar si su gráfico (el círculo) colisiona con el gráfico del proceso de tipo proceso_móvil (el triángulo). El resultado de la función se guarda en la variable privada id2 del programa principal; este valor será 0 cuando no se produzca la colisión y el código identificador de proceso_móvil cuando sí.

Los códigos identificadores de los procesos son siempre números impares, que en el lenguaje se evalúan como condiciones verdaderas (y los números pares se corresponden con condiciones que resultan falsas), luego en el programa anterior se podría haber cambiado la sentencia:

  IF (id2<>0) ... END

Por la siguiente:

  IF (id2) ... END

Para más información al respecto ver: Definición de una condición.


Cuando en el programa se esté visualizando el puntero del ratón (asignando el código del gráfico correspondiente en la estructura mouse), es posible ver si éste choca con el proceso actual utilizando esta función, por ejemplo, de la siguiente forma:

  IF (collision(TYPE mouse))
      // El proceso colisiona con el puntero del ratón
  END

Al detectarse la colisión con el puntero del ratón no se hará con la totalidad del gráfico utilizado como puntero, sino únicamente con el punto de control principal (el número 0) del mismo, denominado usualmente como el "punto caliente" (hotspot) del ratón.


Esta función sirve para detectar colisiones entre gráficos de pantalla o de una ventana de scroll.

No es posible utilizar esta función para detectar colisiones con procesos que no tengan gráfico (un código válido asignado a su variable graph) o entre gráficos de una ventana de modo 7 o modo 8 (con su variable ctype asignada al valor c_m7 o c_m8).

Es, por tanto, imprescindible que tanto el proceso actual como el del tipo que se especifica tengan definido un gráfico.

Para detectar colisiones entre gráficos de una ventana de modo 7 o modo 8 se debe utilizar la función get_dist() para detectar de esta forma cuándo la distancia entre los dos procesos es menor a la que se estipule como distancia de choque.


Ver: get_id() - get_dist() - Tipos de procesos - Formas de obtener el código identificador