Ayuda de Div Games Studio/FRAME
La sentencia FRAME es una parte esencial del lenguaje, Un programa trabaja descrito en términos generales:
- El programa principal inicia su ejecución, este proceso puede crear mas procesos (objetos del juego) en cualquier punto. Todos los procesos pueden finalizar en cualquier momento, y estos pueden crear o eliminar otros procesos.
- Los juegos siempre se mostrarán cuadro por cuadro, en cada cuadro, el sistema ejecutará todos los procesos existentes en su momento, uno a uno, hasta que cada uno ejecute la sentencia FRAME, entonces se indicará que ya se está listo para mostrar un nuevo cuadro.
En la preparación de cada cuadro, la prioridad de todos los procesos serán ejecutados en un orden establecido (la variable local priority determina este orden).
Por lo tanto, esta sentencia es similar a un orden para los procesos que son mostrados.
Si un proceso inicia su ejecución y no lo termina ni ejecuta su sentencia, entonces el programa se bloqueará ya que hay un proceso que nunca se leerá para la siguiente pantalla, por lo tanto, el sistema no tendrá la capacidad de mostrar el siguiente cuadro.
Ejemplo
editarPROGRAM mi_juego
BEGIN
mi_proceso();
mi_proceso();
LOOP
IF (key(_esc))
my_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 (un proceso tipo mi_juego) crea otros dos procesos (de tipo mi_proceso). Desde ese momento, los tres procesos están siendo ejecutados continuamente, cada uno a su sentencia FRAME. Pero si se presiona la tecla escape (ESC), entonces el proceso principal creará un nuevo proceso (de tipo mi_segundo_proceso) que permanecerá en un ciclo LOOP infinito sin ejecutar ningún FRAME. como consecuencia el programa se interrumpirá (el sistema lo reportará después de algunos segundos; ver max_process_time).
Básicamente, todos los procesos se corresponden con objetos de un juego construyendo un ciclo dentro del cual, cada cuadro establece todos los valores de visualización (x, y, graph, size, angle, ...), ejecutandose en la sentencia FRAME.
Sincronización de procesos
editarEs posible usar esta sentencia con la siguiente sintaxis:
FRAME(<porcentaje>))
Poniendo entre paréntesis un porcentaje, de 0 a 100 o mayor, después de la palabra reservada FRAME.
Esto indicará el porcentaje del siguiente cuadro, completado por el proceso. es decir, la ausencia de este porcentaje es equivalente a escribir FRAME(100) (100% del trabajo previo a la siguiente visualización ha sido completado por el proceso).
Por ejemplo, si un proceso ejecuta la sentencia FRAME(25) en un ciclo, este necesitará 4 veces antes de que esté listo para mostrarse (dado que 4*25% da el 100%).
Por otra parte, si un proceso ejecuta la sentencia FRAME(400) dentro de su ciclo, después de la primera ejecución, el habrá completado el 400% de su ciclo, por lo tanto, aun después de la visualización, un 300% de la visualización completada estará perdida, para esto, en la preparación de los siguientes 3 cuadros el sistema no ejecutará este proceso, porque ya está listo para ser visualizado. Entonces, el proceso se ejecutará justo cada 4 cuadros (a diferencia del ejemplo del párrafo anterior, el cual fue ejecutado 4 veces por cada cuadro 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 solo 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.