Almacenamiento de datos del juego
por A.Nadif
I Verifica si el archivo existe o no
¡ Hola y bienvenido para este primer tutorial ! El objetivo de esta primera parte es verificar si un archivo existe o no.
Primero, deben asegurarse que hay estas dos líneas en la parte de arriba :
using Microsoft.Xna.Framework.Storage;
using System.IO;
Despues, necesitan declarar unas cosas :
IAsyncResult result;
StorageDevice device;
bool exists;
KeyboardState keyboardState;
Claro, la variable exists tendrá la valor true si el archivo existe y false si no.
Pongan estas dos líneas en el método Initialize() :
result = Guide.BeginStorageShowDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Despues, vamos a crear un nuevo método : CheckWhetherExists() :
public bool CheckWhetherExists(bool fileExists, StorageDevice storageDevice)
{
StorageContainer myContainer = storageDevice.OpenContainer("YourGameName");
string nameOfFile = Path.Combine(myContainer.path, "fileName.sav");
if (File.Exists(nameOfFile)
{
fileExists = true;
}
else
{
fileExists = false;
}
myContainer.Dispose();
return fileExists;
}
NB : el archivo tiene que estar en Documents\SavedGames\GameName\Player1.
Ahora, en el método Update(GameTime gameTime), pongan lo siguiente :
keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.A))
{
CheckWhetherExists(exists, device);
}
II Como poner datos en un archivo
Ahora, vamos a hacer algo mucho más interesante : vamos a guardar datos en un archivo, de tal manera que no será dificil leer estos datos.
Crean un nuevo proyecto. Deben asegurarse de que hay estas dos líneas al principio :
using Microsoft.Xna.Framework.Storage;
using System.IO;
using System.Xml.Serialization;
Despues, crean una nueva estructura, que pueden llamar Saver. Aquí está la estructura :
public struct DataToSave
{
// Crean un objeto para cada uno de los datos que quieren guardar
// El código de abajo es un ejemplo, depende de lo que quieren guardar.
public string playerModel;
public string playerName;
public Vector3 playerPosition;
}
No olvidan el atributo Serializable, pongan eso antes de la estructura :
[Serializable]
Ahora, unas declaraciones:
IAsyncResult result;
StorageDevice device;
KeyboardState keyboardState;
Enseguida, pongan eso en el método Initialize() :
result = Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Despues, crean un nuevo método (ej. llamado Save()) :
private static void Save(StorageDevice storageDevice) {
// Ponga los datos en los objetos
DataToSave dataToSave = new DataToSave();
dataToSave.playerModel = "playerModelName";
dataToSave.playerName = "Player"; dataToSave.playerPosition = Vector3.Zero;
StorageContainer myContainer = storageDevice.OpenContainer("YourGameName"); // Aquí está el camino para el archivo donde quieren guardar los datos
string nameOfFile = Path.Combine(myContainer.Path, "fileName.sav"); // Si el archivo no existe, será creado, si existe, será reemplazado
FileStream fileStream = File.Open(nameOfFile, FileMode.Create);
XmlSerializer serializer = new XmlSerializer(typeof(DataToSave)); serializer.Serialize(fileStream, dataToSave);
// Ahora, vamos a cerrar el archivo
fileStream.Close();
myContainer.Dispose();
}
Ahora, vamos a crear el método Update(GameTime gameTime) :
keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.A))
{
Save(device);
}
Aquí está lo que resulta :
III Ahora, vamos a leer los datos que acabamos de guardar
Vamos a crear un proyecto muy simple, que va a leer los datos que hemos guardados en la segunda parte. Vamos a cambiar el fondo en negro, si el nombre del jugador, que está en el archivo, es "Plyer". Así, veremos, si todo funciona.
Despues de todo, no olvidan esas líneas al principio :
using Microsoft.Xna.Framework.Storage;
using System.IO;
using System.Xml.Serialization;
Despues, escriben estas :
IAsyncResult result;
StorageDevice device;
KeyboardState keyboardState;
string player = null;
Ahora, creaan LA MISMA ESTRUCTURA QUE HAN CREADO CUNADO GUARDARON LOS DATOS EN EL ARCHIVO. Eso significa : mismo nombre, orden, etc.
Aquí está para mi ejemplo :
[Serializable]
public struct DataToSave
{
public string playerModel;
public string playerName;
public Vector3 playerPosition;
}
En el método Initialize() escriben estas líneas :
result = Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Ahora, vamos a crear el método LoadData().No será un problema si han seguido el tutorial desde el principio :
private void LoadData(StorageDevice storageDevice) {
StorageContainer myContainer = storageDevice.OpenContainer("YourGameName"); string filename = Path.Combine(myContainer.Path, "fileName.sav"); if (!File.Exists(filename)) return ;
FileStream fileStream = File.Open(filename, FileMode.OpenOrCreate, FileAccess.Read); XmlSerializer serializer = new XmlSerializer(typeof(DataToSave)); DataToSave dataToSave = (DataToSave)serializer.Deserialize(fileStream); fileStream.Close();
myContainer.Dispose();
player = dataToSave.playerName;
}
Por fin, queremos que el fondo se vuelva negro si player = "Player", entonces, vamos a hacer eso en el método Draw() :
keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.A)) {
LoadData(device);
}
if (player == "Player") {
GraphicsDevice.Clear(Color.Black); }
else
{
GraphicsDevice.Clear(Color.CornflowerBlue); }
Cargar ejemplo
Yo sé que hace mucho código y que no hay comentarios suficientemente, pero voy a rehacerlo.