Stocker des information dans le jeu
par A.Nadif
I Vérifier qu'un fichier existe
Bonjour et bienvenue pour ce premier tutorial ! Le but de cette première partie est de simplement regarder si un fichier existe ou non.
D'abord, ajoutez ces deux lignes au dessus de votre programme :
using Microsoft.Xna.Framework.Storage;
using System.IO;
Après, vous devez déclarer quelques variables :
IAsyncResult result;
StorageDevice device;
bool exists;
KeyboardState keyboardState;
Evidemment, la variable exists sera true si le fichier existe, et false sinon.
Ajoutez ces deux lignes dans la méthode Initialize():
result = Guide.BeginStorageShowDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Après, on va créer une méthode appelée 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;
}
Notez que le fichier devrait être dans le dossier Documents\SavedGames\GameName\Player1 de votre ordinateur.
Maintenant, dans la méthode Update(GameTime gameTime) ajoutez ceci :
keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.A))
{
CheckWhetherExists(exists, device);
}
II Mettre des informations dans un fichier
OK, alors maintenant, on va passe à quelque chose de plus intéressant : mettre des informations dans un fichier, de façons à pouvoir les lire facilement.
Maintenant, ouvrez un nouveau projet, assurez vous d'avoir ces lignes en haut :
using Microsoft.Xna.Framework.Storage;
using System.IO;
using System.Xml.Serialization;
Puis, créez une nouvelle structure appelée DataToSave. Vous pourriez créer une classe, mais une structure est plus rapide. Voilà la structure :
public struct DataToSave
{
// A faire : créez un objet pour chaque information que vous voulez garder
// Le code ci-dessous est un exemple, étant donné qu'il dépend totalement de votre jeu
public string playerModel;
public string playerName;
public Vector3 playerPosition;
}
Noubliez pas d'ajouter l'attribut Serializable à la structure, en ajoutant ceci au dessus de celle-ci :
[Serializable]
Maintenant, ajoutez ces déclarations :
IAsyncResult result;
StorageDevice device;
KeyboardState keyboardState;
Puis, ajoutez ceci dans la méthode Initialize() :
result = Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Puis, créez une nouvelle méthode (ex : appelée Save()) :
private static void Save(StorageDevice storageDevice) {
// Mettez les informations dans les objets
DataToSave dataToSave = new DataToSave();
dataToSave.playerModel = "playerModelName";
dataToSave.playerName = "Player"; dataToSave.playerPosition = Vector3.Zero;
StorageContainer myContainer = storageDevice.OpenContainer("YourGameName"); // Here is the path to where you want to save your data
string nameOfFile = Path.Combine(myContainer.Path, "fileName.sav"); // Si le fichier existe, il sera remplacé, sinon, il sera créé
FileStream fileStream = File.Open(nameOfFile, FileMode.Create);
XmlSerializer serializer = new XmlSerializer(typeof(DataToSave)); serializer.Serialize(fileStream, dataToSave);
// Maintenant, on ferme le fichier
fileStream.Close();
myContainer.Dispose();
}
Maintenant, occupons nous de la méthode Update(GameTime gameTime) :
keyboardState = Keyboard.GetState();
if (keyboardState.IsKeyDown(Keys.A))
{
Save(device);
}
Et voici le résultat ! :
III Maintenant, lisons les informations que l'on vient de stocker
Nous allons faire un projet très simple, qui va lire des informations dans le fichier que l'on vient juste de créer, et changer en noir la couleur d'arrière plan, si le nom du joueur stocké dans le fichier est "Player". Ainsi, nous pourrons voir si le programme fonctionne.
D'abord, ajoutez ces lignes en haut de votre programme :
using Microsoft.Xna.Framework.Storage;
using System.IO;
using System.Xml.Serialization;
Then, add these declarations :
IAsyncResult result;
StorageDevice device;
KeyboardState keyboardState;
string player = null;
Puis, créez LA MEME STRUCTURE QUE CELLE UTILISEE POUR CREER LE FICHIER. Cela signifie : le MEME nom, ordre, etc.
Pour cet exemple, on a :
[Serializable]
public struct DataToSave
{
public string playerModel;
public string playerName;
public Vector3 playerPosition;
}
Puis, ajoutez ces deux lignes dans la méthode Initialize() :
result = Guide.BeginShowStorageDeviceSelector(PlayerIndex.One, null, null);
device = Guide.EndShowStorageDeviceSelector(result);
Il est temps de s'occuper de notre méthode LoadData(). Cela ne devrait pas vous poser de problème, si vous avez suivis les deux autres parties de ce tutorial :
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;
}
Enfin, nous voulons changer la couleur d'arrière plan si player = "Player", donc, il faut aller dans le méthode Draw() :
keyboardState = Keyboard.GetState(); if (keyboardState.IsKeyDown(Keys.A)) {
LoadData(device);
}
if (player == "Player") {
GraphicsDevice.Clear(Color.Black); }
else
{
GraphicsDevice.Clear(Color.CornflowerBlue); }
Download sample
Je sais que cela fait beaucoup de code et peu de commentaires, mais je vais bientôt le mettre à jour.