Hay dos funciones de alto nivel para reproducir animaciones FLI/FLC: play_fli(), la cual lee datos directamente del disco, y play_memory_fli(), la cual usa datos que ya están cargados en la RAM. Aparte de las diferentes fuentes de las que se sacan los datos, estas dos funciones se comportan de forma idéntica. Ambas dibujan la animación en el bitmap especificado, que debería ser normalmente screen. Los cuadros se alinearán con la esquina superior izquierda del bitmap: si quiere posicionarlos en otra parte de la pantalla tendrá que crear un sub-bitmap y decirle al reproductor FLI que dibuje allí la animación. Si loop está activado, el reproductor volverá al principio de la animación cuando ésta acabe, de otro modo, reproducirá la animación una vez. Si la función callback no es NULL, será llamada por cada frame, permitiéndole realizar tareas en segundo plano. La rutina de callback debe devolver cero: si retorna un valor que no es cero, el reproductor se parará (este es el único modo de parar una animación que esté siendo repetida). El reproductor FLI devuelve FLI_OK si ha llegado al final del fichero, FLI_ERROR si hubo problemas, y el valor de la función callback, si fue ésta la que paró la reproducción. Si necesita distinguir entre diferentes valores de retorno, su rutina de callback debería devolver enteros positivos, ya que FLI_OK es cero y FLI_ERROR negativo. Tome nota de que el reproductor FLI sólo funcionará si se instaló el módulo de temporización, y que alterará la paleta de colores según la del fichero de animación.
Ocasionalmente podría necesitar un control más detallado sobre la reproducción FLI, por ejemplo si quiere sobreimprimir algún texto sobre la animación, o reproducirla a una velocidad diferente. Puede hacer ambas cosas usando las funciones de bajo nivel descritas abajo.
int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)());
Reproduce un fichero FLI o FLC del Autodesk Animator, leyendo los datos
del disco según se necesiten.
int play_memory_fli(void *fli_data, BITMAP *bmp, int loop, int (*callback)());
Reproduce una animación FLI o FLC del AutoDesk Animator, leyendo los
datos de una copia de un fichero que se almacena en memoria. Puede
obtener el puntero fli_data haciendo un malloc a un bloque de memoria y
copiando el fichero FLI allí, o importando un FLI en un fichero de datos
con el grabber. Reproducir animaciones desde la memoria es obviamente más
rápido que desde disco, y es particularmente útil con animaciones FLI
pequeñas que se repiten. Sin embargo, las animaciones pueden fácilmente
llegar a ser grandes, por lo que en la mayoría de los casos sería mejor
que use play_fli().
int open_fli(char *filename);
int open_memory_fli(void *fli_data);
Abre un fichero FLI para reproducirlo, leyendo los datos del disco o de
la memoria respectivamente. Devuelve FLI_OK con éxito. La información del
FLI actual está almacenada en variables globales, por lo que sólo puede
tener una animación abierta a la vez.
void close_fli();
Cierra un FLI cuando haya acabado con él.
int next_fli_frame(int loop);
Lee el siguiente cuadro de la animación actual. Si loop está activado, el
reproductor volverá al principio cuando llegue al final del fichero, o
devolverá FLI_EOF si loop está desactivado. Devuelve FLI_OK con éxito.
FLI_ERROR o FLI_NOT_OPEN si hay error, y FLI_EOF al alcanzar el final del
fichero. El cuadro es leído y almacenado en las variables globales
fli_bitmap y fli_palette.
extern BITMAP *fli_bitmap;
Contiene el cuadro actual de la animación FLI/FLC.
extern PALETTE fli_palette;
Contiene la paleta del FLI actual.
extern int fli_bmp_dirty_from;
extern int fli_bmp_dirty_to;
Estas variables son fijadas por next_fli_frame() para indicar qué parte
de fli_bitmap ha cambiado desde la última llamada a
reset_fli_variables(). Si fli_bmp_dirty_from es mayor que
fli_bmp_dirty_to, el bitmap no cambió. De otro modo, las líneas de
fli_bmp_dirty_from a fli_bmp_dirty_to (inclusive) fueron alteradas.
Puede usar estos valores cuando copie fli_bitmap en pantalla, para
evitar mover datos innecesariamente.
extern int fli_pal_dirty_from;
extern int fli_pal_dirty_to;
Estas variables son fijadas por next_fli_frame() para indicar qué parte
de fli_palette fue cambiada desde la última llamada a
reset_fli_variables(). Si fli_pal_dirty_from es mayor que
fli_pal_dirty_to, la paleta no fue modificada. De otro modo, los colores
de fli_pal_dirty_from a fli_pal_dirty_to (inclusive) fueron alterados.
Puede usar estas variables cuando actualice la paleta hardware, para
evitar llamadas innecesarias a set_palette().
void reset_fli_variables();
Una vez haya hecho lo que fuese a hacer con fli_bitmap y fli_palette,
llame esta función para resetear las variables fli_bmp_dirty_* y
fli_pal_dirty_*.
extern int fli_frame;
Variable global que contiene el número de cuadro actual del fichero FLI.
Esto es útil para sincronizar otros eventos con la animación, por ejemplo
podría chequearla en una función callback de play_fli() y usarla para
reproducir un sample en un punto particular.
extern volatile int fli_timer;
Variable global para cronometrar la reproducción FLI. Cuando abre un
fichero FLI, una interrupción de temporizador es instalada, la cual
incrementa esta variable cada vez que se va a visualizar un nuevo cuadro.
Llamando a next_fli_frame() la decrementa, por lo que puede comprobarla
y saber el momento de enseñar un nuevo cuadro cuando sea mayor que cero.