Uncategorized

XNA Game Studio: Cómo guardar y cargar saves en el XBOX360

Febrero 26th, 2009  |  Publicado en Uncategorized

Hemos notado que existen muchos lugares en internet donde se muestra cómo cargar y guardar savestates para los juegos desarrollados con el XNA Game Studio. Sin embargo, los ejemplos que muestran son un poco complicados para las personas que empiezan a experimentar con la programación, por lo que decidimos explicarlo de la manera más simple posible, de hecho, esta es una version simplificada del ejemplo que puedes encontrar en XNA Creators Club.

Este tutorial asume que el usuario ya cuenta con los siguientes requisitos:

  • Cuentas con un XBOX 360 Game Project creado en el Visual Studio
  • Este proyecto guarda todas las variables del jugador en una clase llamada Jugador.cs
  • El proyecto cuenta con una clase llamada Control, la cual tiene como atributo publico el objeto Jugador que guarda todos los datos.

Una vez que cuentas con estas cosas, lo primero que vamos a hacer es hacer serializable tu clase Jugador.cs, lo cual es muy simple, lo único que debemos agregar es la siguiente etiqueta antes de la declaración de la clase:

[Serializable]
public class Jugador{

//Cuerpo de la clase, se queda exactamente como lo tenías anteriormente

}

Listo! tu clase se encuentra lista para poder ser guardada en un archivo, y poder ser cargado una y otra vez. Nota importante: Si en vez de guardar datos primitivos (int, double, String, etc..) guardas clases hechas por tí, debes poner la etiqueta [Serializable] también a estas clases, de otra manera XNA no sabrá cómo guardarlas y no servirá

Lo siguiente que haremos será agregar a tu proyecto de XBOX 360 una clase llamada Serializador.cs, que contará con dos métodos: GuardarJuego y CargarJuego.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Storage;
using System.IO;
using System.Xml.Serialization;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework;

namespace MiNamespace
{
///


/// Utilizado para guardar y cargar los datos del jugador
///

public class Serializador
{

StorageDevice device;

public void GuardaJuego() {
if(!Guide.IsVisible){
device = null;
Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, GetDevice, null);
}
}

private void GetDevice(IAsyncResult result)
{
device = Guide.EndShowStorageDeviceSelector(result);
if (device.IsConnected)
{
DoSaveGame(device);
}
}

private void DoSaveGame(StorageDevice device)
{
// Cambiar MiJuego por el nombre de tu juego en particular
StorageContainer container =
device.OpenContainer(”MiJuego”);

// Get the path of the save game.
string filename = Path.Combine(container.Path, “SaveMiJuego.sav”);

// Open the file, creating it if necessary.
FileStream stream = File.Open(filename, FileMode.Create);
// Convert the object to XML data and put it in the stream.
XmlSerializer serializer = new XmlSerializer(typeof(Jugador));
serializer.Serialize(stream, Control.jugador);

// Close the file.
stream.Close();

// Dispose the container, to commit changes.
container.Dispose();
}

public void AbreJuego()
{

if(!Guide.IsVisible){
device = null;
Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, GetLoadingDevice, null);
}
}

private void GetLoadingDevice(IAsyncResult result)
{
device = Guide.EndShowStorageDeviceSelector(result);
if (device.IsConnected)
{
DoLoadGame(device);
}
}

private static void DoLoadGame(StorageDevice device)
{
// Cambiar MiJuego por el nombre de tu juego.
StorageContainer container =
device.OpenContainer(”MiJuego”);

// Get the path of the save game.
string filename = Path.Combine(container.Path, “SaveMiJuego.sav”);

// Check to see whether the save exists.
if (!File.Exists(filename))
{
return;
}

// Open the file.
FileStream stream = File.Open(filename, FileMode.OpenOrCreate,
FileAccess.Read);

// Read the data from the file.
XmlSerializer serializer = new XmlSerializer(typeof(Jugador));
Control.jugador = (Jugador)serializer.Deserialize(stream);

// Close the file.
stream.Close();

// Dispose the container.
container.Dispose();
}

}

}

Ya tenemos nuestra clase Serializador. Ahora cada vez que necesitemos guardar el juego lo único que tenemos que hacer es mandar llamar a Serializador.GuardaJuego() o Serializador.CargaJuego().

Esperamos que les sirva de mucho este tutorial. ¡No olviden escribir su comentarios!