PAMERCO wrote:para que sirve un FRAME en una funcion??
La explicacion esta en la DOC de DIV2:
Los nuevos bloques FUNCTION se comportan de forma análoga a las funciones de otros lenguajes de programación, se ejecutan de forma secuencial (y no en paralelo como los bloques PROCESS), no retornando hasta que no han terminado.
FUNCTION <nombre> ( <parámetros> )
<Declaración de datos privados>
BEGIN
<sentencia> ;
...
END
Estos bloques seguirán funcionando de forma muy similar a los procesos normales, pero con una importante diferencia: detendrán al proceso llamador hasta finalizar, es decir, que estas funciones dormirán al proceso que las ha llamado, hasta que estas funciones retornen o su proceso finalice.
Si la función no utiliza sentencias FRAME, se comportará igual que un proceso normal, pero si una función ejecuta la sentencia FRAME, no volverá al bloque que la llamó (como lo haría un proceso normal).
Por lo tanto, una función siempre puede devolver un valor con RETURN(<expresión>), incluso después de haber dado uno o varios FRAME.
--------------------------------------------------------------------------------
Programación secuencial.
No se recomienda programar sólo con funciones y de forma secuencial, pero el conocer cómo se puede hacer facilitará el entendimiento de la programación DIV a programadores de otros lenguajes.
Es posible hacer un programa al estilo de la programación tradicional utilizando exclusivamente los bloques FUNCTION, de esta forma únicamente habrá un proceso en ejecución en cada momento.
Al programar de esta forma, la sentencia FRAME se convierte en la orden explícita de volcado a vídeo. Logicamente, si sólo hay un proceso ejecutándose, cuando este ejecute esta orden el sistema mostrará la siguiente imagen del programa.
Pero, programando asi, ¿se podrían mostrar varios gráficos en pantalla?.
La respuesta es sí, ya que se podrían crear una especie de mini-procesos que funcionaran como una instrucción del estilo "pinta un gráfico para la siguiente imagen" (a diferencia de las funciones como put(), que pintan un gráfico para siempre).
Para mostrar un gráfico en la siguiente imagen se debe construir un proceso que reciba los parámetros visuales necesarios y simplemente ejecute una única sentencia FRAME, por ejemplo:
PROCESS pinta_gráfico(x,y,graph)
BEGIN
FRAME;
END
Al llamar a este proceso se crearía un proceso temporal que se pintaría en la siguiente imagen y entonces desaparecería. Podrían contemplarse otros parámetros (además de x, y, z), como file, size, angle, z, ... (ver los datos locales predefinidos).
Claro que, al programar de esta forma, se debería crear (normalmente en una estructura global) una tabla de sprites de forma que el programa pudiera gestionar todos los gráficos. Esto, que puede parecer complicado, es la forma natural de programar los juegos en cualquier otro lenguaje que no sea DIV.
--------------------------------------------------------------------------------
Aplicaciones en el programa principal.
Las sentencias que aparecen entre las palabras BEGIN y END del programa principal (tras las declaraciones de datos), controlan el proceso principal del programa. Este es el encargado de inicializar el programa, realizar las presentaciones, controlar los bucles de menú, los bucles de juego (creando los procesos necesarios), y finalizar el programa.
En el programa principal, puede ser muy útil llamar a bloques FUNCTION. Ya que de esta forma será detenido el programa principal mientras se ejecuta la parte que controla dicha función.
Por ejemplo, la secuencia de presentación podría hacerse en una función, el menú de opciones en otra, etc. Además, se recuerda que las funciones pueden al finalizar, devolver siempre un valor con RETURN(<expresión>), lo cual puede ser también útil para que, por ejemplo el menú, devuelva el número de opción que ha sido seleccionada
Frame se utiliza por 2 razones:
1 - Para permitir la programacion secuencial como en otros lenguajes.
2 - Porque una FUNCTION es un PROCESS con propriedad especial: bloquea el proceso llamante hasta que su ejecucion no termina (para simular las funciones de otros lenguajes).
Por esta razon FUNCION tiene todas las variables locales, etc... porque es como un proceso y tratado como tal, por ende siendo gestionato en el core y archivado en listas, etc... necesita datos para saber donde volver a ejecutarse, quien es el llamante, cual grafico decir al engine2D de renderizar, etc...
Todo esto comporta que la ejecucion es mas lenta, debito especialmente al tiempo requerido para su llamada y retorno.
Para mejorar la eficiencia, debe evitar alocar todos los datos, ser tratado como un proceso y por ende no puede llamar FRAME.