CPROCESS * fcollision(
CPROCESS * identificador, char * tipo_proceso )
CPROCESS * fcollision(
CPROCESS * identificador, char * tipo_proceso, int igual )
Retorna:
El código identificador de un proceso que colisionó o (0) si ningún proceso colisionó.
Descripción:
Ésta es la función del lenguaje para detectar choques entre gráficos, no se tendrán en cuenta las partes de la imagen que sean transparentes, estas partes se definen como el índice de color 0 para las imágenes de 8 bits y para superior profundidad de color 15, 16, 24 y 32 el color fucsia RGB( 255, 0, 255 ).
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.
Es importante que el proceso que esta dedicado a detectar las colisiones se ejecute antes del que la recibe, ya que el sistema de detección de colisiones de CDIV detectará la colisión del FRAME anterior porque el posterior todavía no es posible conocerlo, por lo que si queremos actuar en consecuencia a la colisión no debemos permitir que el proceso que ha recibir la colisión se ejecute antes. Podrá cambiar el orden de ejecución variando la variable publica priority.
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.
Si se llama a la función fcollision() con un parámetro de entrada "jugador", si existen procesos que se llamen "jugador1", "jugador2", etc. estos también serán objeto del cálculo de la colisión, es decir si se escribe: fcollision(this, "j") todos los procesos que su tipo contenga una 'j' serán objeto de calculo.
Si se llama a la función fcollision( , , 1) con un parámetro de entrada "jugador", si existen procesos que se llamen "jugador1", "jugador2", etc. estos también no serán objeto del cálculo de la colisión, es decir si se escribe: fcollision(this, "j", 1) todos los procesos que su tipo contenga una 'j' no serán objeto de calculo, solo los que se llamen exactamente 'j'.
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 fcollision(). 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_dist2d().
PROCESS_INIT( proceso_movil )(int _x, int _y, int _graph) BEGIN_INIT x=_x; y=_y; graph=_graph; END_INIT BEGIN LOOP{ if (key(_right)) angle-=1000; if (key(_left)) angle+=1000; if (key(_up)) advance2d(4); FRAME; } END MAIN_PROGRAM_CDIV PRIVATE CPROCESS * id2; BEGIN_PROGRAM set_gfx(GFX_AUTODETECT_WINDOWED); set_mode(m320x200); load_fpg("../help.fpg"); put_screen(1, 1); priority = 1; graph = 100; x = 160; y = 100; new proceso_movil(80, 50, 101); LOOP{ delete_text(all_text); write(0, 160, 0, 1, "Use los cursores para mover el triangulo"); id2 = fcollision(this, "proceso_movil"); //Se detecta la colisión if (id2) write(0, 160, 200, 7, " DETECTADA COLISION !"); FRAME; } END_PROGRAM
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_movil con el dibujo de un triángulo controlable con las teclas de los cursores.
El programa principal llamará a la función fcollision() para comprobar si su gráfico (el círculo) colisiona con el gráfico del proceso de tipo proceso_movil (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_movil 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){ ... }
Por la siguiente:
if (id2){ ... }
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_mouse( )){ // El proceso colisiona con el puntero del ratón }
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 con distinta variable región o de una ventana de modo 3D (con su variable ctype asignada al valor c_3d_cam o c_3d_object).
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 3D se debe utilizar la función get_dist3d() 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_dist2d() - Tipos de procesos - Formas de obtener el código identificador