FLIC 例程



有两个演示Fli/Flc动画文件的上层函数, play_fli(), 是从盘中直接读取数据的函数, 和 play_memory_fli(), 从内存中读取数据, 这两个函数除读取数据不同外, 功能实现方法相同,他们将动画画到指定的位图. 也就是 通常说的写屏,动画的帧将被排到本位图的左上角:如果 你想另行设置位置,你必须创建一个子位图来放置Fli 文 件.如果播放器设置为循环播放,当到达最后一 帧时,将回到第一帧重复播放,否则播放器只播放一次就返回. 如果回叫函数不为 NULL, 那么每帧动画上都会被调用一次, 者允许你执行你自己的其他底层任务. 回叫函数的返回值通常为零, 如果返回非零数,则播放器将停止工作(这也是停止循环播放 模式的唯一方法).FLI 播放器如果到达动画文件的尾部, 就返回 FLI_OK, 如果发生错误, 就返回 FLI_ERROR,是什么原因使播放器停止工作,播放器就返回 其相应的值.如果你需要区分返回的不同值,你的返回值应

是正数, 因为 FLI_OK 是零, FLI_ERROR 是负数. 注意:只有当时钟控制器组件安装后,FLI 播放器才能正 常工作,无论动画文件中提供了那种调色板数据,播放器 都将改变这些调色板。

如果你想实现控制 FLI 文件播放的其它功能,如在动 画顶部滚动文字,或者以不同速度播放动画, 或者以不同的速度播放. 你可以使用 下面描述的底层函数.

int play_fli(char *filename, BITMAP *bmp, int loop, int (*callback)());
播放一个Auto desk公司的 FLI 或 FLC 动画文件, 根据需要从磁盘读取 数据.

int play_memory_fli(void *fli_data, BITMAP *bmp, int loop, int (*callback)());
播放一个 Autodesk Animator 的 FLI 或 FLC 动画, 从保存在内存里的文件里读入数据. 你可以运用 fli_data 指针来分配一块内存来将 FLI 文件读进去, 或者从 grabber 数据文件里得到一个 FLI. 从内存里播放动画比直接从磁盘上播放要快的多, 这对于短的循环 FLI 尤其有用. 然而动画文件很容易变的很大, 因此在大多情况下你最好还是使用 play_fli().

int open_fli(char *filename);
int open_memory_fli(void *fli_data);
打开一个准备播放的FLI文件,分别从磁盘或内存中 读取数据,成功后返回 FLI_OK,由于当前有关 FLI 文 件的信息放在全局变量中,因此同一时间你只能打开一个 动画文件.

void close_fli();
当你完成播放后关闭动画文件。

int next_fli_frame(int loop);
读当前动画文件的下一帧,如果是循环播放,当到达 文件尾部时重复播放, 否则要返回 FLI_EOF. 函数执 行成功返回 FLI_OK, 有错误时返回 FLI_ERROR 或者 FLI_NOT_OPEN, 到达文件尾部时返回 FLI_EOF, 每帧信息将 放在全局变量 fli_bitmap 和 fli_palette中.

extern BITMAP *fli_bitmap;
包含FLI/FLC动画的当前帧.

extern PALETTE fli_palette;
包含当前 FLI 文件的调色板.

extern int fli_bmp_dirty_from;
extern int fli_bmp_dirty_to;
这些变量由 next_fli_frame() 函数设置, 指明最后一 次调用 reset_fli_vaviables() 函数以来, fli_bifmap 那一部分被改变. 如果 fli_bmp_dirty_from 函数值大 于 fli_bmp_dirty_to, 那么位图没有变化, 否则位图 被改变, 从 fli_bmp_dirty_from 函数值到 fli_bmp_dirty_to 函数值, 当你拷贝FLI位图到屏幕时, 可以用到这些函数,以避免移动数据失败.

extern int fli_pal_dirty_from;
extern int fli_pal_dirty_to;
者变量由 next_fli_frame() 设置来指示从上次调用 reset_fli_variables(), fli_palette 的哪一部分被改变了. 如果 fli_pal_dirty_from 比 fli_pal_dirty_to 大, 调色板没有改变, 否则 fli_pal_dirty_from 到 file_pal_dirty_to 之间 (包括它们在内) 的颜色被改变了. 你可以在更新硬件调色板时使用他, 来避免不必要的 set_palette() 调用.

void reset_fli_variables();
一旦你使用 fli_bitmap 和 fli_palelte 函数做你要做的任何事后,调用 这个函数来重置 fli_bmp_dirty_* 和 fli_pal_dirty_* 变量.

extern int fli_frame;
包含 FLI 文件帧数的全局变量, 这个函数在保持其它 事件与动画同步时非常有用, 比如你可以在 play_fli() 回叫函数里 检查它, 并用它在一特定位置触发一个声音.


extern volatile int fli_timer;
控制 FLI 播放时间的全局变量, 当你打开一个 FLI 文件时, 就会加载一个时间中断, 当新的一帧画应当被显示时, 这个变量就加一. 调用 next_fli_frame() 函数将减小这个变量, 因此你可以检测它, 当它的值大于零时就知道下帧画该显示了.





返回