viernes, 20 de noviembre de 2015

Crear juego RPG en C++ y Allegro 4 (29) Control de Errores

Aquí esta la última entrega del curso crea tu juego RPG en C++ y Allegro, el control de errores. Se debe de minimizar la cantidad de posibles errores.


Para reducir la cantidad de posibles errores se utiliza la herramienta grabber para unificar todos los archivos multimedia en un archivo .DAT, de esta manera es mas fácil de comprobar su existencia.

A medida que se ha ido haciendo el juego se han añadido nuevos archivos, por ejemplo, los archivos datostienda.dat y objetos.dat. Si alguno de estos archivos falta el juego no funciona y da un error.


Este error esta contemplado, es decir, te avisa de que no existe el archivo .dat, pero no se realiza nada mas. Ya que el programa no funciona en el caso de que falte alguno de los archivos, se debe de hacer que en cuanto falte algún archivo aparte de avisar, que se salga del programa, evitando así otros posibles errores incontrolables.

El juego consta de los siguientes archivos:
RPG.exe - El ejecutable de la aplicación
datostienda.dat - Imagenes, sonidos, etc.
objetos.dat - Imagenes de los objetos.
objetos.txt - Información de todos los objetos que aparecen en el juego.
datostienda.dat - Imagenes de fondos para las tiendas.
tiendas.txt - tipos de tiendas que hay en el juego.
list01.txt - lista de objetos de una tienda
list02.txt - lista de objetos de una tienda

Esta lista es según el ejemplo del curso, pero si se han añadido mas mapas, y mas tiendas es posible que se aumente el numero de archivos que utiliza el juego.

Por cada uno de los archivos, deberíamos de comprobar su existencia, y en el caso de no encontrarlo salir del juego.

¿ Que otros tipos de errores se pueden tener ?

Como existen varios archivos de texto (.txt), que se hicieron así para que cada uno pueda añadir sus objetos, tiendas, etc. Se puede dar el caso que aunque exista el archivo, este archivo no contenga una información correcta para el programa. En ese caso cuando el juego intente acceder a la información es muy probable que salte un error.



Este tipo de errores es muy difícil de detectar, por ello es recomendable tener siempre un orden, y un formato a la hora de acceder a la información, para intentar detectar si se a leído algún dato erróneo. De esta manera, poder parar la ejecución del juego e indicar que existe algún problema al leer el archivo.  También pueden contener información errónea si el usuario del juego intenta manipular dichos archivos, por ello es recomendable que estén protegidos.

Los errores de ejecución son los más difíciles de detectar, ya que requiere de que alguien testee el juego, y compruebe todas las posibles opciones.

Evidentemente no se pueden controlar todos los posibles errores, pero cuantos mas tengamos en cuenta esto determinará la estabilidad de nuestro juego.

Otro error que no se controla es ... ¿ que ocurre si la primera vez le damos a cargar partida ? ... El programa no controla si existe el archivo, y debería comprobar si existe, en el caso de no existir debería ser igual que cuando das a iniciar partida.


Programación

Se crea una variable que contenga si existe algún error, en nuestro caso se ha llamado la variable sys_error, esta variable como se va a utilizar en todos las funciones nos interesa que sea global, por tanto su definición se realiza en global.h.

int sys_error;

Se considera sin error en el caso de que la variable tenga como valor cero.

Se debe añadir en todas las condiciones que comprueban la existencia de los ficheros, de modo de que cuando no existan alguno, la variable sys_error tenga una valor, y dependiendo de este valor se sabe que tipo de error es.

En este caso, pondré un ejemplo de como hacerlo.

En el archivo mijuego.h, en la función carga_inicio().

    datosjuego = load_datafile("datosjuego.dat");
    if ( !datosjuego ){
       allegro_message("Error: archivo datosjuego.dat no encontrado\n%s\n", allegro_error);       
       sys_error = 7;
    }

En este ejemplo, se carga el archivo datosjuego.dat. En el caso de no existir da un mensaje de error: "Error: archivo datosjuego.dat no encontrado", y además se le asigna el valor 7 a la variable sys_error que en mi caso es el que indica que el archivo datosjuego.dat no existe.

De esta forma, mirando el valor de la variable sys_error el programa puede saber si ha habido un error, ya que siempre debe valer cero en el caso de no tener ningún error.

Una vez detectado el error, se debe evitar que continúe el programa. Para ello se añade lo siguiente en el archivo main.cpp en la función main().

// programa principal 
int main()  
{ 
    sys_error = 0;
    
    inicia_allegro();
    
    carga_inicio();
    
    musica_menu();
         
    int op;    
    MIMENU menu;
      
    while ( !menu.salir() && sys_error == 0 )
    {

De esta forma el bucle principal se detiene en cuanto la variable sys_error sea distinto de cero, evitando así que se generen mas errores.

    if ( sys_error != 0 )
    {                             
        allegro_message("Se ha encontrado un Error: %d\n", sys_error);
    }
 return 0;
}
END_OF_MAIN();

Añadiendo esto último, se mostrará por pantalla una ventana indicando el error que se ha detectado.

En el caso de querer cargar partida cuando no existe ninguna partida, es un error que se puede solucionar, si se da este caso se debe iniciar partida de forma normal.

Por un lado hay que controlar si existe la partida.  En el archivo partidas.h en la función carga_partida(), se añade una condición que controle si ha habido algún error al cargar la partida.

    fichero = pack_fopen("partida.sav","r");    
    if ( fichero )
    {


       ...

    
        pack_fclose(fichero);
    }else{
        // no existe partida guardada  
        sys_error = 6;  
   }

En el caso de no existir el archivo, sys_error toma el valor 6, que en este ejemplo es el que representa que no existe la partida guardada.

Luego se debe añadir el control del error, para que se inicie una partida nueva. En el archivo main.cpp, en la función main().

          if ( op == 2 )
          {
                // carga partida
                carga_partida();
                if ( sys_error == 6 )
                {
                     // pasamos a partida nueva
                     op = 1;
                     sys_error = 0;
                }     
          } 
          if ( op == 1 )
          {
               // partida nueva

De este modo, cuando sys_error vale 6, se asigna a op el valor 1 para indicar que se inicia una partida nueva, y se pone el valor cero a la variable sys_error para indicar que se ha solucionado el error.

1 comentario:

  1. Oye, son buenisimo tus cursos de programación, no lo posees en videos? :C

    ResponderEliminar

Related Posts Plugin for WordPress, Blogger...