数据文件例程



数据文件是由 grabber 工具创建的, 它的后缀名为 .dat. 它们可以包含位图, 调色板, 字体, 采样声音, MIDI 音乐, FLI/FLC 动画, 和任何你输入的其它 2 进制数据.

警告: 当使用真彩图片时, 你必须总在载入位图数据前设置图形模式! 否则点格式 (RGB 或 BGR) 将不清楚, 因此文件的转换可能是错的.

参见 pack_fopen() 的文档可得到怎样直接从指定数据文件对象中读取的信息.


DATAFILE *load_datafile(char *filename);
将数据文件读入内存, 返回一个指向它的指针, 错误时为 NULL. 如果数据文件被加密了, 你必须先使用 packfile_password() 函数来设置合适的密码. 见 grabber.txt 得到更多的信息. 如果 datafile 包含了真彩图形, 你在读入它之前必须设置显示模式或调用 set_color_conversion().

void unload_datafile(DATAFILE *dat);
释放 datafile 里的所有对象.

DATAFILE *load_datafile_object(char *filename, char *objectname);
将一个指定的对象装入数据文件. 如果用户将对象的名字从该文件中 去掉的话, 此函数不能正常工作. 存贮一个带有全局压缩的文件将会 是十分费时的. grabber.txt 中有详细内容.

void unload_datafile_object(DATAFILE *dat);
将一个先前通过 load_datafile_object() 装载的对象释放.

char *get_datafile_property(DATAFILE *dat, int type);
返回对象的特定属性字符串, 如果该对象的属性不存在则返回一个空 字符串. grabber.txt 中有详细介绍.

void register_datafile_object(int id, void *(*load)(PACKFILE *f, long size), void (*destroy)(void *data));
该函数用来添加自定义对象类型, 并且指定用来装载和撤销该类对象 的函数. grabber.txt 中有详细介绍.

void fixup_datafile(DATAFILE *data);
如果用户使用的是包含真彩色图象且被编译过的数据文件 (由 dat2s 工具 产生),则用户比需在设制显示模式 (video mode) 或调用该函数来将颜色值 转换成适当的格式. 该函数负责在 RGB 和 BGR 格式间切换, 并且在可能 的情况下在不同的颜色深度间转换而不改变图象的大小 (ie.高彩位图或 RLE精灵在 15 <->16 位两种格式间转换, 或真彩 RLE 精灵在 24<->32 位两种格式间转换).

 


当用户装载了一个数据文件后将获得一个指向 DATAFILE 结构数组的指 针:

typedef struct DATAFILE
{
   void *dat;     - 指向实际数据的指针
   int type;      - 数据的类型
   long size;     - 数据所占的字节数
   void *prop;    - 对象的属性列表
} DATAFILE;

type 域可以为以下的值:
   DAT_FILE       - dat 域指向一个嵌套的数据文件
   DAT_DATA       - dat 域指向一块二进制数据
   DAT_FONT       - dat 域指向指向一个字体对象
   DAT_SAMPLE     - dat 域指向指向一个样例结构
   DAT_MIDI       - dat 域指向指向 MIDI 文件
   DAT_PATCH      - dat 域指向指向 GUS 补丁文件
   DAT_FLI        - dat 域指向 FLI/FLC 动画
   DAT_BITMAP     - dat 域指向一个BITMAP结构
   DAT_RLE_SPRITE - dat 域指向一个 RLE_SPRITE 结构
   DAT_C_SPRITE   - dat 域指向一个线性编译精灵
   DAT_XC_SPRITE  - dat 域指向一个 mode-X 编译精灵
   DAT_PALETTE    - dat 域指向一个有 256 项 RGB 结构的数组
   DAT_END        - 用来表示数据列表结尾的特殊标记

grabber 程序可以产生一个将文件中每个对象目录定义成一系列 #define 常量, 常量名为用户在 grabber 中输入的对象名. 举例来说, 如果用户建立 了一个数据文件 foo.dat, 其包含一个位图叫作 THE_IMAGE, 用户可以通 过下面的代码片段来显式它:


   #include "foo.h"

DATAFILE *data = load_datafile("foo.dat"); draw_sprite(screen, data[THE_IMAGE].dat, x, y);

如过用户使用的是 C++ 则将得到一个错误. 这是因为 dat 域是一个 void 类型指针, 而 draw_sprite() 需要一个 BITMAP 类型的指针. 用户可通过强 制类型转换来解决, eg:

   draw_sprite(screen, (BITMAP *)data[THE_IMAGE].dat, x, y);

 



返回