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

XNA/Monogame Discussion :

Sérialisation semi automatique


Sujet :

XNA/Monogame

  1. #1
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut Sérialisation semi automatique
    Bonjour à tous,

    Je me heurte à un problème actuellement dans le cadre de mon projet perso en XNA 4.0 concernant la sérialisation automatique des objets. Voici mon problème :

    J'ai tout d'abord une classe du jeu qui possède des propriétés sérialisables (simplifiée) :

    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
    using Microsoft.Xna.Framework.Content;
     
    namespace Game
    {
     
        public class MyObject
        {
            [ContentSerializer( ElementName = "Position" )]
            public Vector2 m_vPosition;
     
            [ContentSerializer( ElementName = "Dimension" )]
            public Vector2 m_vDimension;
        }
     
    }
    Mon but est de pouvoir récupérer et setter les attributs sérialisable de cette classe sans la connaître a priori, le tout avec XNA. Plus précisément, je voudrais créer une classe Wrapper dans le moteur qui va encapsuler un objet de type MyObject, dans lequel on peut spécifier des propriétés à la volée :

    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
    using Microsoft.Xna.Framework.Content;
     
    namespace Engine
    {
        public class Wrapper
        {
            [ContentSerializer( ElementName = "ObjectType" )]
            private string m_sObjectType;
     
            [ContentSerializer( ElementName = "Properties", CollectionItemName = "Property" )]
            private Dictionary<string,string> m_aProperties;
     
            public Wrapper();
            public void SetProperty( string sProperty, string sValue );
            public Object GetObject();
        }
     
    }
    Ainsi, avec le XML suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <Object AssetType = "Engine.Wrapper">
        <ObjectType>MyObject</ObjectType>
        <Properties>
            <Property>
                <Key>Position</Key>
                <Vaue>32 32</Value>
            </Property>
            <Property>
                <Key>Dimension</Key>
                <Value>16 16</Value>
            </Property>
        </Properties>
    </Object>
    On obtiendrais par la fonction GetObject de Wrapper un objet de type MyObject dont les attributs possèdent les bonnes valeurs.

    Je sais que cela est possible avec la réflexion, et j'avais d'ailleurs commencé à écrire le code pour faire cela, mais cela implique de réécrire en quelque sorte toute la couche de sérialisation de XNA... Ma question est donc de savoir si le framework est suffisament customisable pour désérialiser des attributs à partir de chaînes de caractères. J'ai cherché un peu dans la doc, mais je n'ai rien trouvé à ce sujet... Sinon peut-être que quelqu'un a une meilleure idée pour réaliser ce que je veux faire sans passer par la réflexion ?

    Merci d'avance

  2. #2
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par dancingmad Voir le message
    Mon but est de pouvoir récupérer et setter les attributs sérialisable de cette classe sans la connaître a priori, le tout avec XNA.
    Il est possible d'utiliser XmlSerizializer de C# sur PC et XBOX qui fait exactement ce que tu souhaites : tu as besoin de passer par ContentSerializer pour quelque chose de spécifique ?


    Citation Envoyé par dancingmad Voir le message
    Plus précisément, je voudrais créer une classe Wrapper dans le moteur qui va encapsuler un objet de type MyObject,
    Quelle est la finalité de cette classe wrapper ?
    Dans la mesure où habituellement il suffit d'appeler Deserialize sur un stream pour récupérer l'objet ?

    J'ai juste besoin de ces précisions pour t'orienter, c'est quelque chose que j'ai certainement déjà du faire.
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par MoDDiB Voir le message
    Il est possible d'utiliser XmlSerizializer de C# sur PC et XBOX qui fait exactement ce que tu souhaites : tu as besoin de passer par ContentSerializer pour quelque chose de spécifique ?
    Eh bien, disons que tout mon moteur est basé sur le ContentSerializer, donc comme je suis flemmard, je voudrais toucher le moins possible au code

    Citation Envoyé par MoDDiB Voir le message
    Quelle est la finalité de cette classe wrapper ?
    Il y a deux choses. Tout d'abord simplifier la tâche des levels designers : mon système permettrait de ne setter que les attributs dont on a besoin, pour le reste les valeurs par défaut seraient utilisées. Dans une classe qui contient 15 attributs sérialisables, la plupart du temps on ne veux changer que 2 ou 3 attributs, c'est donc une question de lisibilité. Mais mettons que cette finalité n'est pas très importante.

    Le but principale et de pouvoir manipuler les classes du jeu dans un éditeur perso. L'éditeur est construit sur le moteur mais n'a pas connaissance des classes du jeu, donc il passer par une classe wrapper qui est contenu dans le moteur.

    En écrivant cette réponse, je viens de me rendre compte qu'il y a peut-être une solution plus simple que cela

    Si je compile mon jeu sous forme de DLL, je peux le charger facilement dans l'éditeur et avoir accès directement aux classes du jeu. MoDDiB, cette solution te paraît acceptable ?

  4. #4
    Membre expert

    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Février 2006
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 1 031
    Points : 3 092
    Points
    3 092
    Par défaut
    Citation Envoyé par dancingmad Voir le message
    Si je compile mon jeu sous forme de DLL, je peux le charger facilement dans l'éditeur et avoir accès directement aux classes du jeu. MoDDiB, cette solution te paraît acceptable ?
    Extraire la partie commune dans une DLL serait la solution la plus propre.

    D'ailleurs de mon côté le moteur graphique et le game engine sont des dlls à part dans lesquelles viennent piocher le jeu et les éditeurs.

    Après si ton projet est un prototype rapide tu peux déjà référencer ton projet de jeu, pas besoin d'en faire une dll en .net !
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  5. #5
    Membre averti
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Points : 448
    Points
    448
    Par défaut
    C'est parti pour cette solution alors. Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bloquer la saisie semi automatique du navigateur
    Par Oluha dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 01/02/2007, 22h53
  2. Problème avec la saisie semi-automatique d'internet explorer
    Par haltabush dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 07/02/2006, 13h23
  3. Saisie semi automatique
    Par Necron dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 06/02/2006, 09h05
  4. Saisie semi-automatique
    Par kurul1 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/01/2006, 08h20
  5. Liste déroulante en saisie semi automatique
    Par pier07 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 29/07/2005, 17h02

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