La gestion des fichiers en XNA 4.0

L’arrivée de la nouvelle version de XNA (passage de la version 3.1 à 4.0) a apporté son lot de nouveautés, notamment la possibilité de faire ses jeux en XNA sur Windows Phone 7 ! Mais ce n’est pas tout, des modifications ont aussi été apportées sur l’utilisation des classes du framework, c’est le cas pour les classes concernant la gestion des fichiers.

Auparavant, nous utilisions la classe statique Guide, et ses méthodes BeginShowStorageDeviceSelector et EndShowStorageDeviceSelector nous permettant d’obtenir de manière asynchrone une instance de StorageDevice. Une fois cette instance obtenue nous appelions la méthode OepnContainer afin de récupérer une instance de StorageContainer.

A présent, la récupération du StorageDevice se fait grâce aux méthodes statiques BeginShowSelector et EndShowSelector placées dans la classe StorageDevice elle même. Pour récupérer notre StorageDevice nous faisons de la manière suivante ( pour plus de lisibilité, seule la partie du code concernant la gestion des fichiers est affichée ici, il vous faut bien sûr laisser les méthodes Initialize, LoadContent, UnloadContent, Update et Draw ) :

public class MainGame : Microsoft.Xna.Framework.Game
{
   GraphicsDeviceManager graphics;
   StorageDevice storageDevice;

   public MainGame()
   {
       graphics = new GraphicsDeviceManager(this);
       this.Components.Add(new GamerServicesComponent(this));
       Content.RootDirectory = « Content »;
       StorageDevice.BeginShowSelector(GetStorageDevice, null);
   }

   private void GetStorageDevice(IAsyncResult result)
   {
       storageDevice = StorageDevice.EndShowSelector(result);
   }
}

Jusque là, rien de bien différent mis à part le nom des méthodes et leur classe à partir de laquelle elles sont appelées. La réelle nouveauté va être lors de la récupération du StorageContainer, auparavant nous avions une simple méthode OpenContainer prenant en paramètre le nom du StorageContainer dans notre système de fichier. A présent, la récupération du StorageContainer se fait de manière asynchrone avec BeginOpenContainer et EndOpenContainer. Imaginons qu’ils nous faillent récupérer notre StorageContainer se nommant « Onefor4 » dès la récupération du StorageDevice, nous créons alors une seconde méthode que nous nommerons par exemple “GetStorageContainer” et qui servira de méthode de rappel lors de l’appel de BeginOpenContainer.

Notre code “enrichi” ressemblera à cela :

public class MainGame : Microsoft.Xna.Framework.Game
{
   GraphicsDeviceManager graphics;
   StorageDevice storageDevice;
   StorageContainer storageContainer;

   public MainGame()
   {
       graphics = new GraphicsDeviceManager(this);
       this.Components.Add(new GamerServicesComponent(this));
       Content.RootDirectory = « Content »;
       StorageDevice.BeginShowSelector(GetStorageDevice, null);
   }

   private void GetStorageDevice(IAsyncResult result)
   {
       storageDevice = StorageDevice.EndShowSelector(result);
       storageDevice.BeginOpenContainer(« OneFor4 », GetStorageContainer, null);
   }

   private void GetStorageContainer(IAsyncResult result)
   {
       storageContainer = storageDevice.EndOpenContainer(result);
   }
}

Mais cela fait beaucoup de méthodes asynchrones à utiliser dans notre classe MainGame à mon gout. Pour y obtenir un code plus léger, j’ai créé une classe StorageService. Dans celle ci, nous instancierons un StorageDevice tout comme nous le faisions précédemment. Nous y créerons ensuite deux méthodes publiques permettant de récupérer de manière asynchrone notre StorageDevice.

Notre classe StorageService ressemblera à ceci:

public class StorageService
{
   StorageDevice _device;

   public StorageService()
   {
       StorageDevice.BeginShowSelector(new AsyncCallback(EndShowSelector), null);
   }

   private void EndShowSelector(IAsyncResult result)
   {
       _device = StorageDevice.EndShowSelector(result);
   }

   public IAsyncResult BeginGetStorageContainer(string name, AsyncCallback callBack)
   {
       return _device.BeginOpenContainer(name, callBack, null);
   }

public StorageContainer EndGetStorageContainer(IAsyncResult result)
   {
       return _device.EndOpenContainer(result);
   }
}

Il nous suffit à présent dans notre classe MainGame d’instancier notre StorageService et d’utiliser ses méthodes BeginGetStorageContainer et EndGetStorageContainer pour récuperer de manière plus simplifiée notre StorageContainer :

public class MainGame : Microsoft.Xna.Framework.Game
{
   GraphicsDeviceManager graphics;
   StorageContainer storageContainer;
   StorageService storageService;
   public MainGame()
   {
       graphics = new GraphicsDeviceManager(this);
       this.Components.Add(new GamerServicesComponent(this));
       Content.RootDirectory = « Content »;
       storageService = new StorageService();
       storageService.BeginGetStorageContainer(« Onefor4 », GetStorageContainer);
   }

   private void GetStorageContainer(IAsyncResult result)
   {
       storageContainer = storageService.EndGetStorageContainer(result);
   }
}

Vous pourrez bien entendu rajouter l’instance de StorageService à la collection Services de notre MainGame afin d’y accéder où vous voulez dans votre jeu.

Ceci est notre premier article traitant de XNA, mais nous aurons certainement l’occasion d’en reparler prochainement.

A bientôt sur notre blog !

Ecrit par Mathieu Hollebecq

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s