La sentencia FRAME y FRAME_PERCENT son 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.
Nota: Cada vez que se ejecuta la sentencia FRAME o FRAME_PERCENT todas las variables declaradas en el bloque BEGIN ... END perderán su valor, solo mantendrán su valor las variables en el proceso con PUBLIC o PRIVATE o las variables globales.
PROCESS( mi_proceso ) BEGIN LOOP FRAME; END PROCESS( mi_segundo_proceso ) BEGIN LOOP FRAME; END MAIN_PROGRAM_CDIV BEGIN_PROGRAM new mi_proceso(); new mi_proceso(); LOOP{ if (key(_enter)) new mi_segundo_proceso(); FRAME; } END_PROGRAM
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 ENTER, 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á bloqueado.
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_PERCENT(porcentaje)
Poniendo un porcentaje entero, de 0 a 100 o mayor, entre paréntesis tras la palabra reservada FRAME_PERCENT.
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_PERCENT(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_PERCENT(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_PERCENT(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_PERCENT(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_PERCENT(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_PERCENT(0), hará que el proceso termine su ejecución igual que si se llamase a una función return.
Ver: Sintaxis