28 Rutinas de ficheros de datos

Los ficheros de datos son creados por la utilidad grabber, y tienen la extensión .dat. Pueden contener bitmaps, paletas de color, fuentes, sonidos, música MIDI, animaciones FLI/FLC y cualquier otro tipo binario de datos que importe.

Atención: cuando use imágenes truecolor, debería activar el modo gráfico antes de cargar ningún bitmap! Si no, el formato (RGB o BGR) será desconocido, y el fichero probablemente será convertido erróneamente.

Mire la documentación en pack_fopen() para obtener información sobre como leer directamente de un fichero de datos.


DATAFILE *load_datafile(const char *filename);
Carga un fichero de datos en memora, devolviendo un puntero hacia él, o NULL si ha habido un error. Si el fichero de datos ha sido encriptado, primero tiene que usar la función packfile_password() para introducir la clave correcta. Mire grabber.txt para mas información. Si el fichero de datos contiene gráficos truecolor, debe entrar en modo gráfico o llamar set_color_conversion() antes de cargarlo.

Relacionado con: find_datafile_object, register_datafile_object, load_datafile_callback, unload_datafile, load_datafile_object, set_color_conversion, fixup_datafile, packfile_password.
DATAFILE *load_datafile_callback(const char *filename, void (*callback)(DATAFILE *d));
Carga el datafile en memoria, llamando a la función de enganche (hook) especificada una vez por cada objeto en el fichero, pasándole un puntero al objeto leído recientemente.
Relacionado con: find_datafile_object, register_datafile_object, load_datafile, unload_datafile, load_datafile_object, set_color_conversion, fixup_datafile, packfile_password.
void unload_datafile(DATAFILE *dat);
Libera todos los objetos de un fichero de datos.
Relacionado con: load_datafile.
DATAFILE *load_datafile_object(const char *filename, const char *objectname);
Carga un objeto específico de un fichero dat. Esto no funcionará si elimina los nombres de los objetos del fichero, y será muy lento si salva el fichero de datos con compresión general. Mire grabber.txt para más información.
Relacionado con: register_datafile_object, unload_datafile_object, load_datafile, set_color_conversion.
void unload_datafile_object(DATAFILE *dat);
Libera un objeto previamente cargado con load_datafile_object().
Relacionado con: load_datafile_object.
DATAFILE *find_datafile_object(DATAFILE *dat, const char *objectname);
Busca en un fichero de datos que esté cargado un objeto con el nombre especificado, devolviendo un puntero a él, o NULL si el objeto no fue encontrado. Entiende '/' y '#' como separadores para paths de ficheros de datos anidados.
Relacionado con: load_datafile, load_datafile_object.
char *get_datafile_property(DATAFILE *dat, int type);
Retorna la propiedad especifica de un objeto, o una cadena vacía si la propiedad no esta presente. Mire grabber.txt para mas información.


void register_datafile_object(int id, void *(*load)(PACKFILE *f, long size), void (*destroy)(void *data));
Usado para añadir tipos de objetos propios, especificando las funciones de carga y destrucción de este tipo. Mire grabber.txt para mas información.

Relacionado con: load_datafile, load_datafile_object.
void fixup_datafile(DATAFILE *data);
Si está usando ficheros de datos compilados (producidos por la utilidad dat2s) que contienen imágenes truecolor, tiene que llamar esta función una vez haya puesto el modo de vídeo que vaya a usar, para convertir los valores de los colores al formato apropiado. Puede intercambiar los formatos RGB y BGR, y convertirlos a diferentes profundidades de color siempre que sea posible sin cambiar el tamaño de la imagen (por ejemplo: cambiando entre 15 y 16 bits de color para bitmaps y sprites RLE, y entre 24 y 32 bits de color para sprites RLE).
Relacionado con: set_gfx_mode, set_color_conversion.

Usando ficheros de datos

Cuando cargue un fichero de datos, obtendrá un puntero a un array de estructuras DATAFILE:

   typedef struct DATAFILE
   {
      void *dat;     - puntero a los datos
      int type;      - tipo del dato
      long size;     - tamaño de los datos en bytes
      void *prop;    - propiedades de los objetos
   } DATAFILE;
El campo type puede tener uno de los siguientes valores:
   DAT_FILE       - dat apunta a un fichero de datos anidado
   DAT_DATA       - dat apunta a un bloque ordinario de datos
   DAT_FONT       - dat apunta a una fuente
   DAT_SAMPLE     - dat apunta a un fichero de sonido
   DAT_MIDI       - dat apunta a un fichero MIDI
   DAT_PATCH      - dat apunta a un 'patch' para la GUS
   DAT_FLI        - dat apunta a una animación FLI/FLC
   DAT_BITMAP     - dat apunta a una estructura BITMAP
   DAT_RLE_SPRITE - dat apunta a una estructura RLE_SPRITE
   DAT_C_SPRITE   - dat apunta a un sprite compilado linearmente
   DAT_XC_SPRITE  - dat apunta a un sprite de modo-X
   DAT_PALETTE    - dat apunta a un array de 256 estructuras RGB
   DAT_END        - bit especial que marca el final de una lista de datos
El programa grabber también puede producir un fichero de cabecera que define el índice de los objetos dentro de un fichero de datos como una serie de constantes definidas, usando los nombres que les dio en el grabber. Por ejemplo, si creó un fichero de datos llamado foo.dat que contiene el bitmap llamado LA_IMAGEN, puede enseñarlo con el siguiente fragmento de código:
   #include "foo.h"

   DATAFILE *data = load_datafile("foo.dat");
   draw_sprite(screen, data[LA_IMAGEN].dat, x, y);
Si está programando en C++. obtendrá un error porque el campo dat es un puntero void y draw_sprite espera un puntero BITMAP. Puede solucionarlo con una conversión de puntero. Ejemplo:
   draw_sprite(screen, (BITMAP *)data[LA_IMAGEN].dat, x, y);
Cuando carge un sólo objeto de un fichero de datos, obtendrá un puntero a una estructura DATAFILE única. Esto significa que no puede acceder a él como un array, y no contiene el objeto DAT_END. Ejemplo:
   objeto_musica = load_datafile_object("datos.dat", "MUSICA");
   play_midi(objeto_musica->;dat);



Volver al Indice