martes, 8 de septiembre de 2015

Crear juego RPG en C++ y Allegro 4 (9) DAT

Continuamos con el curso de crea tu juego RPG en C++ y Allegro. En esta entrega se utilizará la aplicación grabber con la idea de unificar todos los archivos utilizados en uno solo.




NOTA IMPORTANTE:

Para realizar este curso es necesario tener hecho los anteriores, ya que solo se hace referencia a cambios en el código.

GRABBER ficheros DAT

Si nunca ha utilizado esta utilidad, le aconsejo que se miren esta página, ya que aquí se centra mas en la programación que en el manejo del grabber y la creación del archivo.

Se crea un archivo .DAT mediante la utilidad grabber. Este fichero contendrá todas las imágenes, sonidos, y músicas que se han utilizado en todo el proyecto, de esta forma se facilita el traslado del proyecto, sin que se pierda ningún archivo, y permite proteger el contenido.
A cada uno de los archivos que se van poniendo se le ha puesto como nombre, el nombre que tenia el objeto y una letra d delante para indicar que es un objeto del datafile, y seguido de una "i" si se trata de una imagen, una "s" si se trata de un sonido, o una "m" si se trata de una música.
Ejemplo: La imagen del prota llamada personaje.bmp se ha renombrado dentro del datafile como dipersonaje.  La imagen casa-sup.bmp se ha llamado como dicasasup. El sonido del bosque.wav queda dsbosque. Y la musica1.mid queda como dmmusica1.

El fichero datafile creado tiene una contraseña que es "cursoRPGkodaygames", y lleva una compresión global para reducir el tamaño de los archivos. El archivo queda como se muestra la imagen.

Programación

En el archivo global.h definimos dos variables, una que contiene la contraseña del fichero DAT y la otra datosjuegos que es del tipo DATAFILE.

// clave del fichero datafile
char evalc[19]="cursoRPGkodaygames";

DATAFILE *datosjuego;

En el archivo main.cpp, en la función inicia_allegro() se quita la llamada a la función inicia_sonido(), y se sustituye por set_volume(230, 90);  ya que no es necesaria la función inicia_sonido(). Tambien hay que añadir un nuevo #include para añadir el archivo datosjuego.h que se genera a partir del fichero DAT.

#include <allegro.h> 
#include "global.h"
#include "datosjuego.h"
#include "audio.h"
#include "players.h"
#include "mijuego.h"  

En el archivo players.h, solo hay que cambiar una linea que es la que se encarga de cargar la imagen del personaje, debe sustituirse por:

    prota  = (BITMAP *)datosjuego[dipersonaje].dat;

Este cambio se debe a que ya no se utiliza el archivo BMP directamente, sino que se extrae del archivo datosjuego.dat que lo contiene todo.

En el archivo audio.h, se elimina todas las variables declaradas de forma global, y también se borra la función inicia_sonido(), ya que todos estos datos que anteriormente se cargaba ahora lo hace cuando se carga el fichero DAT. El acceso a los sonidos y la música cambia quedando de la siguiente forma el archivo audio.h

// audio.h

void sonido_pasos(){
    play_sample ( (SAMPLE *)datosjuego[dspasos].dat, 160,128, 3300, 0 );   
}

void sonido_abrirpuerta(){
     play_sample ( (SAMPLE *)datosjuego[dsabrirpuerta].dat, 100,128, 1300, 0 );   
}

void sonido_ambiente(){
      play_sample ( (SAMPLE *)datosjuego[dsbosque].dat, 80,128, 900, 1 );  
}

void para_sonido_ambiente(){
      stop_sample( (SAMPLE *)datosjuego[dsbosque].dat );
}

void musica_casa(){
      play_midi((MIDI *)datosjuego[dmmusica1].dat,1);
}     

void musica_bosque(){
      play_midi((MIDI *)datosjuego[dmmusica2].dat,1);
}     

    
En el archivo mijuego.h, se elimina las siguientes variables.

BITMAP *casa_a;
BITMAP *casa_b;
BITMAP *casa_c;
BITMAP *bosq_a;
BITMAP *bosq_b;
BITMAP *bosq_c;

Todas estas variables tampoco hacen falta, pues se utiliza directamente las del fichero DAT.

Por tanto en la función carga_juego(), se debe de eliminar también la inicialización de las variables anteriores quedando la función de la siguiente forma:

// carga todo lo necesario antes de empezar el juego
void carga_juego()
{
     
    packfile_password(evalc);
    datosjuego = load_datafile("datosjuego.dat");
    if ( !datosjuego ){
       allegro_message("Error: archivo datosjuego.dat no encontrado\n%s\n", allegro_error);       
    }    
                  
    jugador.inicia();
 
    fondo  = (BITMAP *)datosjuego[dicasa].dat;
    choque = (BITMAP *)datosjuego[dicasachoque].dat;
    cielo  = (BITMAP *)datosjuego[dicasasup].dat;
    
    lugar = 1;  
    
    desplazamiento_map_x=0;
    desplazamiento_map_y=0;     
    desplaza = false;
    
    musica_casa();
}

En esta función se añade las primeras lineas para la carga del fichero DAT, la primera linea especificamos la contraseña del archivo. En la segunda linea carga el archivo datosjuego.dat. Y en la siguiente condición se comprueba de que no haya un error en la lectura del archivo.

En la función actualiza_juego(),  cuando se comprueba la variable lugar para saber si se cambia de escenario, se cambia las variables fondo, choque y cielo.

    switch ( lugar ) 
    {           
    case 1:   // casa
         if ( cambio == 1 )
         {
              // cambiamos a otro lugar              
              lugar = 2;
              fondo  = (BITMAP *)datosjuego[dibosque].dat;
              choque = (BITMAP *)datosjuego[dibosquechoque].dat;
              cielo  = (BITMAP *)datosjuego[dibosquesup].dat;               
              jugador.posiciona( 410,370 ); 
              desplazamiento_map_x=0;
              desplazamiento_map_y=160; 
              desplaza=true;     
              sonido_abrirpuerta();     
              sonido_ambiente();
              musica_bosque();
         }
         break;
    case 2:   // bosque
         if ( cambio == 2 )
         {
              // cambiamos a otro lugar
              lugar = 1;
              fondo  = (BITMAP *)datosjuego[dicasa].dat;
              choque = (BITMAP *)datosjuego[dicasachoque].dat;
              cielo  = (BITMAP *)datosjuego[dicasasup].dat;              
              // situamos al prota dentro de la casa
              jugador.posiciona( 290,440 ); 
              desplazamiento_map_x=0;
              desplazamiento_map_y=0;  
              desplaza=false;   
              sonido_abrirpuerta(); 
              para_sonido_ambiente();   
              musica_casa();   
         }
         break;  
    default:
         break;
    } 

Y aquí acaba todos los cambios que se deben hacer para poder utilizar el fichero DAT. Para evitar algunos problemas con los archivos, les dejo el fichero DAT comprimido en RAR para descargar.

Si quieres ver alguna de las anteriores entregas entra en el Contenido del Blog.


Recuerda, si tienes algún problema con los ejemplos de la pagina, o alguna duda. Puedes plantear tu pregunta en el foro de programación:


3 comentarios:

  1. Al momento de compilarlo me muestra un error de que el archivo no ha sido encontrado.
    ¿Como lo puedo solucionar?

    ResponderEliminar
    Respuestas
    1. Fijate al final en los últimos párrafos esta el link del archivo .DAT. Debes descargarlo para poder compilar y ejecutarlo.

      Eliminar
  2. Compila sin error pero no me muestra la imagen, que puede ser ?

    ResponderEliminar

Antes de publicar un comentario

Todos los comentarios que se realicen en el blog son moderados.

Debido a esto es muy probable que tu comentario no aparezca de inmediato ya que previamente debe ser revisado para evitar un mal uso (SPAM).

Podrán realizar comentario cualquiera que tenga una cuenta de Google.

Related Posts Plugin for WordPress, Blogger...