XNA Meeting point

Multi language XNA tutorials meeting point

Accueil
English
Français
Español
Search
Archive (EN)
Archive (FR)
Stockage
Physique : tutorial 1
Shaders : tutorial 1
Shaders : tutorial 2
Shaders : tutorial 3
Shaders : tutorial 4
Planètes : Partie I
Publier : partie 1
Archivo (ES)
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.