jueves, 29 de octubre de 2015

Crear juego RPG en C++ y Allegro 4 (25) Guardar Partida

Aquí esta una nueva entrega del curso crea tu juego RPG en C++ y Allegro. Hoy se hará para guardar la partida.




Guardar la partida es guardar todos los valores necesarios, para que después se pueda carga la partida y continuar por donde lo hemos dejado.

Por un lado se tiene que guardar todos los datos de nuestro personaje, como son las coordenadas x,y, vida, experiencia, nivel, etc.

Por otro lado todos los datos referente al escenario donde nos encontramos, en este caso se guarda la variable lugar, desplazamiento_map_x y desplazamiento_map_y. Que son necesarios para situar a nuestro personaje.

También sería necesario guardar todo lo referente a la misión actual, y misiones realizadas. El problema es que aun no se ha implementado esto. Asi que es una cosa a tener en cuenta en un futuro.

También hay que guardar el valor de todas la variables globales, para poder volver al estado en el que estábamos cuando se cargue la partida.

Una duda que se me plantea es como se quiere que se guarde la partida. Que el jugador tenga que ir a un punto concreto para guardar la partida, o que en cualquier momento pueda acceder al menú y guardar la partida.

De la primera forma, nos aseguramos de que no este en ningún sitio o estado comprometido. De la segunda forma esto no pasa, debería de controlarse de que no pueda guardar partida mientras lucha o cuando esta en medio de un dialogo.

Todo lo referente a cargar y guardar partida se pondrá en un nuevo archivo llamado partidas.h.

Dicho todo esto pasamos a la implementación de la función

void guarda_partida(){
    char contenido[255];
   
    packfile_password("kodaygames2015");
    PACKFILE *fichero;
    
    fichero = pack_fopen("partida.sav","w");


Inicializamos las variables que vamos a utilizar, contenido va a almacenar los datos antes de volcarlo al archivo. Se le indica la contraseña que tendrá el archivo mediante el comando packfile_password, de esta manera nadie podrá ver lo que contiene, y mucho menos modificarlo. Se crea una variable del tipo PACKFILE llamada fichero, que se utilizará para manejar el archivo que se va a guardar.
El comando pack_fopen("partida.sav","w"); se utiliza para abrir el archivo partida.sav en modo escritura, por tanto sobre escribe todo lo anterior.

// datos del jugador
            
    pack_fputs(itoa(jugador.getx(),contenido,10), fichero);       
    pack_fputs("\n", fichero);

    pack_fputs(itoa(jugador.gety(),contenido,10), fichero);       
    pack_fputs("\n", fichero);  
    
    pack_fputs(itoa(jugador.getvida(),contenido,10), fichero);       
    pack_fputs("\n", fichero); 
    
    pack_fputs(itoa(jugador.getvidamax(),contenido,10), fichero);       
    pack_fputs("\n", fichero);       
              
    pack_fputs(itoa(jugador.getexp(),contenido,10), fichero);       
    pack_fputs("\n", fichero);              
    
    pack_fputs(itoa(jugador.getnivel(),contenido,10), fichero);       
    pack_fputs("\n", fichero);              
    
    pack_fputs(itoa(jugador.getdinero(),contenido,10), fichero);       
    pack_fputs("\n", fichero);
    
    pack_fputs(itoa(jugador.getcasco(),contenido,10), fichero);       
    pack_fputs("\n", fichero);
    
    pack_fputs(itoa(jugador.getarmadura(),contenido,10), fichero);       
    pack_fputs("\n", fichero);
    
    pack_fputs(itoa(jugador.getarma(),contenido,10), fichero);       
    pack_fputs("\n", fichero);
    
    pack_fputs(itoa(jugador.getanillo(),contenido,10), fichero);       
    pack_fputs("\n", fichero);    
        
    for (int i=0; i < 12; i++)
    {
        pack_fputs(itoa(jugador.getinventario(i),contenido,10), fichero);       
        pack_fputs("\n", fichero);    
    } 

Se va guardando en cada linea un dato, primero la posición del jugador x,y, luego la vida, vidamax, experiencia, nivel, dinero, lo que lleva equipado casco, armadura, arma y anillo. Y finalmente se guarda todo lo que tenga en el inventario. Después de cada dato se almacena un salto de linea "\n", para que de este modo solo haya un dato por linea, para facilitar luego su lectura.

// datos del escenario
    
    pack_fputs(itoa(lugar,contenido,10), fichero);       
    pack_fputs("\n", fichero);   
       
    pack_fputs(itoa(desplazamiento_map_x,contenido,10), fichero);       
    pack_fputs("\n", fichero);  
    
    pack_fputs(itoa(desplazamiento_map_y,contenido,10), fichero);       
    pack_fputs("\n", fichero);    
         
 // npc y enemigos

    pack_fputs(itoa(npersonaje,contenido,10), fichero);       
    pack_fputs("\n", fichero);    
   
    for( int i=0; i < npersonaje; i++)
    {
        pack_fputs(itoa(personajes[i].getimg(),contenido,10), fichero);       
        pack_fputs("\n", fichero);        
        
        pack_fputs(itoa(personajes[i].getx(),contenido,10), fichero);       
        pack_fputs("\n", fichero);   
        
        pack_fputs(itoa(personajes[i].gety(),contenido,10), fichero);       
        pack_fputs("\n", fichero); 
        
        pack_fputs(itoa(personajes[i].getdir(),contenido,10), fichero);       
        pack_fputs("\n", fichero);   
        
        pack_fputs(itoa(personajes[i].getestado(),contenido,10), fichero);       
        pack_fputs("\n", fichero);     
        
        pack_fputs(itoa(personajes[i].getlugar(),contenido,10), fichero);       
        pack_fputs("\n", fichero);                          
    }   
    
    pack_fputs(itoa(nmalos,contenido,10), fichero);       
    pack_fputs("\n", fichero);    
   
    for( int i=0; i < nmalos; i++)
    {
        pack_fputs(itoa(malos[i].getimg(),contenido,10), fichero);       
        pack_fputs("\n", fichero);   
         
        pack_fputs(itoa(malos[i].getx(),contenido,10), fichero);       
        pack_fputs("\n", fichero);   
        
        pack_fputs(itoa(malos[i].gety(),contenido,10), fichero);       
        pack_fputs("\n", fichero); 
        
        pack_fputs(itoa(malos[i].getdir(),contenido,10), fichero);       
        pack_fputs("\n", fichero);   
        
        pack_fputs(itoa(malos[i].getestado(),contenido,10), fichero);       
        pack_fputs("\n", fichero);     
        
        pack_fputs(itoa(malos[i].getlugar(),contenido,10), fichero);       
        pack_fputs("\n", fichero);     
        
        pack_fputs(itoa(malos[i].getvida(),contenido,10), fichero);       
        pack_fputs("\n", fichero);
                                      
    }
   
    pack_fclose(fichero);
};


Continuamos guardando datos, ahora toca los del escenario. Se almacena en el fichero la variable lugar, desplazamiento_map_x, desplazamiento_map_y. Después se tienen que guardar tambien los npc y los enemigos.  Por cada uno de los npc se almacena el numero de imagen, la posicion x,y, direccion, estado y lugar. Al igual que para los enemigos pero añadiendo la vida.

Y finalmente para acabar cerramos el archivo.

3 comentarios:

  1. Hola. ¿Podrías explicar este error? Gracias de antemano.

    Al compilar este capítulo me da el siguiente error:

    partidas.h: In function ‘void guarda_partida()’:
    partidas.h:14:16: error: ‘itoa’ was not declared in this scope
    14 | pack_fputs(itoa(jugador.getx(),contenido,10), fichero);

    ResponderEliminar
    Respuestas
    1. según parece no está declarado la función itoa. Probablemente se me olvidaría incluir la librería que contiene dicha función. Prueba a poner #include y me dices si te funcionó. Saludos

      Eliminar
    2. prueba a incluir la libreria stdlib.h ... en mi respuesta anterior esa parte no apareció.

      Eliminar

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...