IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#]Enregistrement des préférences dans un fichier XML


Sujet :

C#

  1. #1
    Membre à l'essai Avatar de Noxalus
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut [C#]Enregistrement des préférences dans un fichier XML
    Bonjour à toutes et à tous !

    Je travaille actuellement sur un projet de jeu vidéo 2D. Celui-ci est bientôt terminé, et j'aimerais passer à l'étape de l'enregistrement des préférences de l'utilisateur.

    Pour être plus clair, le jeu dispose d'un menu permettant de changer la résolution, la configuration des touches ou même de la partie. Afin que l'utilisateur ne soit pas obligé à chaque démarrage du jeu de changer la résolution (par exemple), j'aimerais stocker ces informations dans un fichier (XML ?) puis les restituer.

    Actuellement, toutes les infos que je voudrais enregistrer sont contenues dans une classe "Config" à part en static. L'ensemble des classes du projet a accès à toutes les variables de ce fichier "Config". Il me suffirait donc de charger un fichier XML, plutôt que de mettre des valeurs par défaut à ces variables.

    Avant de demander de l'aide ici, je me suis renseigné sur ce qu'on pouvait faire en XML, et j'ai découvert la classe "System.XML" qui permet facilement de lire et d'écrire dans des fichiers. Voici ce que j'ai fait pour m'entrainer un peu:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    // Ecriture du fichier 
                XmlTextWriter fichier = new XmlTextWriter("config.xml", null); 
                fichier.WriteStartDocument(); 
                fichier.WriteWhitespace("\n"); 
                fichier.WriteWhitespace("\t"); 
                fichier.WriteStartElement("resolution"); 
     
                fichier.WriteWhitespace("\n"); 
                fichier.WriteWhitespace("\t\t"); 
                fichier.WriteStartElement("largeur"); 
                fichier.WriteString("1280"); 
                fichier.WriteEndElement(); 
                fichier.WriteWhitespace("\n"); 
     
                fichier.WriteWhitespace("\t\t"); 
                fichier.WriteStartElement("hauteur"); 
                fichier.WriteString("1024"); 
                fichier.WriteEndElement(); 
                fichier.WriteWhitespace("\n"); 
     
                fichier.WriteWhitespace("\t"); 
                fichier.WriteEndElement(); 
     
     
                fichier.WriteEndDocument(); 
                fichier.Close();
    Ce code produit un fichier XML avec ce contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?xml version="1.0"?> 
     <resolution> 
      <largeur>1280</largeur> 
      <hauteur>1024</hauteur> 
     </resolution>
    Maintenant, je passe à l'étape de la lecture et j'ai fait ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Lecture du fichier 
                XmlTextReader config = new XmlTextReader("config.xml"); 
                config.WhitespaceHandling = WhitespaceHandling.None; 
     
                int[] resolution = new int[2]; 
     
                while (config.Read()) 
                { 
                    if (config.LocalName == "largeur") 
                        resolution[0] = Convert.ToInt32(config.ReadString()); 
                    else if(config.LocalName == "hauteur") 
                        resolution[1] = Convert.ToInt32(config.ReadString()); 
                }
    Ce code fonctionne bien, le tableau "resolution" contient bien les deux valeurs, mais est-ce vraiment la meilleur façon de procéder ? J'ai beaucoup de variables différentes, et je me vois mal enchaîner les "else if" dans la boucle principale.

    De plus, à chaque modification par l'utilisateur via le menu, il faudra réécrire le fichier XML, mais devrais-je tout réécrire où il existe un moyen de changer uniquement la valeur entre telle ou telle balise ?

    Maintenant, est-ce que XML est le meilleur moyen d'arriver à mes fins ? Comment font les jeux commerciaux pour enregistrer les préférences de ses utilisateurs ?

    Merci d'avance pour vos réponses !

    Bonne soirée

  2. #2
    Membre actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Points : 290
    Points
    290
    Par défaut
    Salut,
    Je voulais faire la même chose dans une application (sauvegarder les préfences ou des informations propre à l'application), et j'ai utiliser les Paramètres de l'application. Voila comment procéder.

    Dans l'explorateur de solution tu clique sur Properties ensuite tu va dans l'onglet paramètres et là ta une sorte de grille ou tableau où tu ajoute tes paramètres ainsi que le choix de leurs types ainsi q'une valeur par défaut si tu le veux.

    Remarque importante : Pour que la valeur du paramètre soit en lecture écriture il faut que tu met sa portée en Utilisateurs.

    Et pour modifier ou récupérer la valeur de tes paramètres tu écrit le code suivant :
    NomDeTaSolution.Properties.Settings.Default.NomDuParam

    @++

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2008
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2008
    Messages : 381
    Points : 766
    Points
    766
    Par défaut
    Tu n'es pas obligé de tout faire à la main. Tu peux utiliser la sérialization.

    Moi j'utilise cette fonction pour sauvegarder une classe dans un fichier xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void SaveToXml(object o, System.Type type, string filename)
    {
    	XmlSerializer s = new XmlSerializer(type);
    	XmlWriterSettings settings = new XmlWriterSettings();
    	settings.Encoding = Encoding.UTF8;
    	settings.Indent = !protect;
    	settings.IndentChars = ("\t");
    	using (XmlWriter w = XmlWriter.Create(filename, settings))
    	{
    		s.Serialize(w, o);
    		w.Flush();
    	}	
    }
    Et pour charger la classe sauvegarder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public static object LoadFromXML(System.Type type, string filename)
    {
    	if (File.Exists(filename))
    	{
    		object result;
     
    		XmlReader r = XmlReader.Create(new StreamReader(filename));
     
    		XmlSerializer s = new XmlSerializer(type);
    		result = s.Deserialize(r);
    		r.Close();
     
    		return result;
    	}
    	return null;
    }
    Et pour l'utilisation, quelque chose dans le genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaveToXml(MaVariable, typeof(MaClasse), "C:\\config.xml");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVariable = LoadFromXML(typeof(MaClasse), "C:\\config.xml");

  4. #4
    Membre à l'essai Avatar de Noxalus
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Merci beaucoup à vous deux pour vos réponses !

    Si ce qu'a dit oussi fonctionne bien, il est certain que c'est la solution que je vais préférer !

    Merci encore !

  5. #5
    Membre à l'essai Avatar de Noxalus
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 14
    Points : 10
    Points
    10
    Par défaut
    Je me permet de faire un double post pour savoir s'il est possible de stocker des tableaux dans les paramètres.

    Pour les touches par exemple, étant donné qu'on peut jouer à 4, j'ai un tableau de Keys à 2 dimensions, mais même si j'ai réussi à trouver le type "Keys" dans les paramètres, il semble impossible de faire un tableau.

    Comment faites-vous ?

    Merci encore !

    EDIT: je viens de tester pour tes paramètres avec des types simples, et ça ne fonctionne pas, aucun paramètre n'est enregistré et ça revient à chaque fois à sa valeur par défaut, même avec la publication !

    Voici un screen de ce que j'ai fait:



    Les changements sont bien effectué dans le jeu, si je change la valeur de "Final_Bomber.Properties.Settings.Default.plein_ecran" (Final_Bomber étant le nom de ma solution), le jeu se met bien en plein écran !

    EDIT2: C'est bon, en lisant la doc, j'ai trouvé ceci:

    Notez que dans les langages autres que Visual Basic, vous devez appeler explicitement la méthode Save de cette classe wrapper pour conserver les paramètres utilisateur. Cela s'effectue habituellement dans le gestionnaire d'événements Closing du formulaire principal.
    Comme mon projet est un projet XNA et non un Windows Forms, je n'ai pas de "Closing", mais j'ai une méthode "UnloadContent". Il me suffit donc d'appeler la méthode "Save" de "Settings" à l'intérieur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            protected override void UnloadContent()
            {
                Settings.Default.Save();
            }

  6. #6
    Membre actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Points : 290
    Points
    290
    Par défaut
    Salut,
    Ah oui c'est la méthode Save() j'ai oublié de la préciser hier, désolé.

    Et pour les tableaux je ne les jamais fais avant mais si c'est possible ça sera le bonheur totale
    En tout cas je vais chercher de mon coté et si je trouve quelque chose je te ferai signe.

    @++

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Points : 1 050
    Points
    1 050
    Par défaut
    Et pour les tableaux je ne les jamais fais avant mais si c'est possible ça sera le bonheur totale
    Tu peux par exemple choisir comme type (tu fais "parcourir") System.Collections.Specialized et tu choisis la collection qui t'intéresse

    ou encore System.Collections.ArrayList

    A+
    Claude

  8. #8
    Membre actif Avatar de oussi
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 192
    Points : 290
    Points
    290
    Par défaut
    Salut,
    Merci ClaudeBg,je vais essayer ça dés que possible.

Discussions similaires

  1. enregistrement des données dans un fichier XML
    Par floriza dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 06/05/2011, 09h12
  2. [Flex4] enregistrement des informations dans un fichier xml
    Par web.ikram dans le forum Flex
    Réponses: 4
    Dernier message: 09/03/2011, 05h04
  3. [Plugin] Enregistrer des données dans un fichier XML
    Par bulldo dans le forum Eclipse Platform
    Réponses: 8
    Dernier message: 05/08/2010, 09h12
  4. Enregistrer des donnees dans un fichier XML
    Par doudoubens dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 06/03/2009, 01h21
  5. Réponses: 6
    Dernier message: 05/02/2008, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo