Sentencia FRAME

La sentencia FRAME es una pieza clave dentro del lenguaje. El funcionamiento de un programa es, a grandes rasgos, el siguiente:

- Comienza ejecutándose el proceso principal, el cual puede crear más procesos (objetos del juego) en cualquier punto. Todos los procesos pueden finalizar en cualquier momento, crear o eliminar otros procesos.

- Los juegos se visualizarán siempre imagen a imagen (frame by frame). En cada imagen, el sistema ejecutará todos los procesos existentes en ese momento, uno por uno, hasta que cada uno ejecute la sentencia FRAME, que indicará que está listo para la siguiente visualización (imagen).

En la preparación de cada imagen todos los procesos serán ejecutados en el orden de prioridad establecido (la variable local priority de los procesos determina este orden).

Luego esta sentencia es algo así como la orden de visualización de los procesos.

Si un proceso comienza a ejecutarse y no finaliza ni ejecuta esta sentencia, entonces el programa se quedará bloqueado, ya que existe un proceso que no está nunca listo para la siguiente visualización; por lo que el sistema será incapaz de mostrar la siguiente imagen.

Ejemplo:
PROGRAM mi_juego;
BEGIN
    mi_proceso();
    mi_proceso();
    LOOP
        IF (key(_esc))
            mi_segundo_proceso();
        END
        FRAME;
    END
END
PROCESS mi_proceso()
BEGIN
    LOOP
        FRAME;
    END
END
PROCESS mi_segundo_proceso()
BEGIN
    LOOP
    END
END


En este programa el proceso principal (de tipo mi_juego) crea otros dos procesos (de tipo mi_proceso); a partir de este momento los tres procesos se ejecutarán continuamente, cada uno hasta su sentencia FRAME. Pero si se pulsa la tecla de escape (ESC), el proceso principal creará un nuevo proceso (de tipo mi_segundo_proceso) que se quedará en un bucle LOOP indefinidamente, sin ejecutar ningún FRAME, por lo que el programa quedará interrumpido (el sistema advertirá de dicha situación transcurridos unos segundos, ver max_process_time).

Básicamente, todos los procesos que se corresponden con objetos de un juego construyen un bucle dentro del cual, cada imagen, fija todos sus valores de visualización (x, y, graph, size, angle, ...) y, después, ejecutan la sentencia FRAME.

Sincronización de procesos


Es posible utilizar esta sentencia con la siguiente sintaxis:

FRAME(<porcentaje>)

Poniendo un porcentaje entero, de 0 a 100 o mayor, entre paréntesis tras la palabra reservada FRAME.

Este porcentaje indicará el tanto por ciento de la siguiente imagen completado por el proceso; es decir, cuando no se especifica dicho porcentaje es lo mismo que si se pusiera FRAME(100) (se ha completado el 100% del trabajo previo a la siguiente visualización por parte del proceso).

Por ejemplo, si un proceso ejecuta en un bucle la sentencia FRAME(25), necesitará ejecutarla 4 veces antes de estar listo para la siguiente visualización (ya que 4*25% es el 100%).

En el otro extremo, si un proceso ejecuta dentro de su bucle la sentencia FRAME(400), cuando se ejecute la primera vez habrá completado ya un 400% de la visualización, por lo que, aun tras visualizarse, le seguirá restando un 300% de visualización completado. Por ello, en la preparación de las siguientes 3 imágenes el sistema no ejecutará dicho proceso, pues ya está listo para la visualización. Luego este proceso se ejecutaría sólo una de cada 4 imágenes (al contrario que el ejemplo del párrafo anterior, que se ejecutaba 4 veces por cada imagen del juego).

Los procesos no llegarán a la siguiente visualización hasta no dar, por lo menos, el 100%. Por ejemplo, si un proceso ejecuta siempre sentencias FRAME(80), las ejecutará dos veces antes de la primera visualización con lo que llevará el 160% (2*80%) de la visualización completado. Para la siguiente visualización tendrá, por tanto, un 60% pre-completado (160%-100%); por ello, en la segunda visualización tan sólo requerirá una sentencia FRAME(80) para visualizarse, ya que este 80%, unido al 60% sobrante de la primera, hará un total de un 140% completado, con lo cual se visualizará inmediatamente, e incluso le sobrará otro 40% para la preparación de la siguiente imagen.


Una sentencia FRAME(0), que complete un 0% de la siguiente visualización, puede tener sentido en estos dos casos:

- Puede ser una forma de forzar al sistema a que ejecute en ese punto al resto de los procesos que tienen la misma prioridad que el actual y que, tras ellos, vuelva a ejecutarlo.

- O puede ser una forma de inicializar funciones como get_id() o collision(), pues éstas devuelven unos determinados valores para cada imagen; si se quiere volver a obtener valores de nuevo, se puede ejecutar una sentencia FRAME(0) que estas funciones interpretarán como una nueva imagen.


Ver: Sintaxis