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 :

Architecture d'un jeu


Sujet :

XNA/Monogame

  1. #1
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut Architecture d'un jeu
    Bonjour !

    J'ai commencé récemment à utiliser XNA et plus généralement à me pencher sur la réalisation d'un moteur de jeu. J'ai commencé il y a peu ce dernier mais je suis heurté à un faux-problème, je viens donc vous demander conseil.

    La structure est classique (celle qu'on voit dans tout les tutos traitant du sujet) :

    Un GameManager gère plusieurs Engine : GraphicsEngine, SoundEngine et GameEngine. C'est lui qui les instancie, leur indique de se mettre à jour etc.

    GameManager hérite de Microsoft.Xna.Framework.Game.

    SoudEngine gère plusieurs classes liées au son, dont AmbientMusic.

    Je voudrais avoir accès au ContentManager de Game dans AmbientMusic. Suis-je obligé de me trimbaler le pointeur de GameManager partout?

    (si c'est vraiment pas clair je ferais un schéma! )

    merci

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 378
    Points
    20 378
    Par défaut
    Citation Envoyé par ApheX2 Voir le message
    Un GameManager gère plusieurs Engine : GraphicsEngine, SoundEngine et GameEngine. C'est lui qui les instancie, leur indique de se mettre à jour etc.
    oui c'est classique mais bof je n'en vois pas toujours l'intérêt parce que tu vas avoir des simples singletons

    Je voudrais avoir accès au ContentManager de Game dans AmbientMusic. Suis-je obligé de me trimbaler le pointeur de GameManager partout?

    (si c'est vraiment pas clair je ferais un schéma! )
    oui c'est parfaitement clair ; tu peux utiliser aussi l'héritage mais parfois les concepts de POO ne s'appliquent pas toujours à l'architecture d'un jeu parce que tu as la plupart du temps en majorité des singletons...c'est-à-dire des simples classes avec une seule instance ..
    par contre si tu fais un RTS là il est intéressant voire indispensable de faire autant de classes qu'il n'y a des unités.
    Mais faire une classe pour le son, une classe pour le rendu graphique avec 3 méthodes pour l'affichage booff je ne sais pas j'en vois pas trop l'intérêt..

    Est-ce que quelqu'un a un meilleur point de vue ?

  3. #3
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Hello Mat.

    Je comprend pas trop ton point de vue. N'est-il pas important de bien séparer la partie graphique du son et de la partie gameplay du jeu? Je crois que j'ai pas compris ce que tu voulais dire :s

    (Effectivement ces 3 engine utilise déjà le singleton pattern.)

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Citation Envoyé par ApheX2 Voir le message
    Hello Mat.

    Je comprend pas trop ton point de vue. N'est-il pas important de bien séparer la partie graphique du son et de la partie gameplay du jeu? Je crois que j'ai pas compris ce que tu voulais dire :s

    (Effectivement ces 3 engine utilise déjà le singleton pattern.)
    Je pense que cela dépend de votre objectif ( et aussi de ce que l'on utilise ). Je vois bien la nécessité de faire une classe pour géré les graphismes facilement, mais pour le reste l'utilisation déjà très simple des classes natives de XNA font que l'on a pas vraiment besoin de s'amuser à tout faire en "plus propre".

    Sinon, pour éviter de ce trimbaler toujours le pointeur sur le contentManager ( ou autre ), il faut simplement le passer lors de la création de la classe. Pour un singleton nous allons tricher en le passant en utilisant une fonction init().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Sinon, pour éviter de ce trimbaler toujours le pointeur sur le contentManager ( ou autre ), il faut simplement le passer lors de la création de la classe. Pour un singleton nous allons tricher en le passant en utilisant une fonction init().
    J'aurai dit la même chose ou alors passer par une classe/méthode static

  6. #6
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    Dans mon framework, j'ai la classe Display qui est en static, ainsi que la classe ResourceManager. Pas besoin de s'embêter à passer les instances.

  7. #7
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Merci pour vos réponses mais finalement j'ai changé de manière de faire.
    Je vais créer plusieurs ContentManager : un pour les sprites, un pour le son etc. Cela dans le but de pouvoir par exemple Unload tous ce qui touche à l'audio sans Unload le reste (car la méthode Unload enlève absolument tout). Par contre j'ai pas trop compris comment créer un nouveau ContentManager, existe-t-il un tuto quelque part?

    Au passage si quelqu'un à une technique pour pouvoir unload une asset particulière sans avoir à créer un ContentManager particulier je suis preneur.

    Bien à vous

  8. #8
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    Si tu veux, tu peux jeter un oeil à mon ResourceManager.

  9. #9
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Merci iliak, je vais regarder ça.

    Sinon je pense partir sur un jeu 2D à scrolling "parallax" horizontal. La question que je me pose, c'est comment charger un niveau? Admettons que j'ai un niveau qui fasse 8000 pixel de large, et que la résolution du jeu soit de 500px pour la largeur.
    Dois-je découper mon sprite de background en 16 parties?
    Si oui, vaut-il mieux tout afficher (donc meme ce qui "sort" de l'écran) ou afficher un sprite de 500px plus les 2 sprites adjacent (-500 et +500)?

    Représenter un niveau (sprite et leur position, action etc.) par un xml est une bonne solution?

  10. #10
    Membre régulier
    Profil pro
    profiler
    Inscrit en
    Février 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : profiler

    Informations forums :
    Inscription : Février 2008
    Messages : 84
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par ApheX2 Voir le message
    Merci iliak, je vais regarder ça.

    Sinon je pense partir sur un jeu 2D à scrolling "parallax" horizontal. La question que je me pose, c'est comment charger un niveau? Admettons que j'ai un niveau qui fasse 8000 pixel de large, et que la résolution du jeu soit de 500px pour la largeur.
    Dois-je découper mon sprite de background en 16 parties?
    Si oui, vaut-il mieux tout afficher (donc meme ce qui "sort" de l'écran) ou afficher un sprite de 500px plus les 2 sprites adjacent (-500 et +500)?

    Représenter un niveau (sprite et leur position, action etc.) par un xml est une bonne solution?
    Tu touches du doigts le "tile scrolling". Dans le lien que je t'ai filé, regarde le projet "Ruff'n'Tumble", tu devrais y trouver ton bonheur je pense...

  11. #11
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par ApheX2 Voir le message
    Si oui, vaut-il mieux tout afficher (donc meme ce qui "sort" de l'écran) ou afficher un sprite de 500px plus les 2 sprites adjacent (-500 et +500)?
    Ne pas afficher ce qui n'est pas sur l'écran. ( a un sprite prêt pour avoir un scrolling doux )

    Citation Envoyé par ApheX2 Voir le message
    Représenter un niveau (sprite et leur position, action etc.) par un xml est une bonne solution?
    Oui le xml est une bonne idée, et en plus c'est bien géré dans XNA.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  12. #12
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Ok merci.

    Je viens de me renseigner sur le XnaContent pour le XML. Mais j'arrive pas du tout à le faire marcher :

    There was an error while deserializing intermediate XML. Cannot find type "DSinsEngine.Sources.Engine.GameEngine.Level"
    Pourtant voici la déclaration de ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    namespace DSinsEngine.Sources.Engine.GameEngine
    {
        public class Level
        {
    Et mon xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <Asset Type="DSinsEngine.Sources.Engine.GameEngine.Level">
     
      </Asset>
    </XnaContent>
    Une idée?

    (En tout cas j'ai l'impression que c'est plus galère à utiliser que du xml classique)

  13. #13
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Pour le XML, comme d'habitude, je te renvoie vers l'excellent, que dis je grandiose article de Gullix sur le sujet :

    http://www.gulix.fr/blog/spip.php?article142

  14. #14
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Merci pour ton lien yodaime, il m'a été très utile !

    Sinon question "àlacon" mais, le personnage principal de cette vidéo est-il en 2D (sprites) ou 3D?
    YouTube - Broadcast Yourself.

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 577
    Points
    218 577
    Billets dans le blog
    120
    Par défaut
    Assez difficile à dire, mais je pense à un modèle 3D, qui a été animé, puis mis en sprite 2D ... mais je n'en suis trop pas sur
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Bon décidément j'ai du mal à faire marcher mon XnaContent, j'ai toujours la même erreur :
    There was an error while deserializing intermediate XML. Cannot find type "DSinsEngine.Sources.Level"
    Pourtant l'arborescence me semble bonne, et mes writer & reader aussi :



    Mon XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <Asset Type="DSinsEngine.Level"></Asset>
    </XnaContent>
    Je pense que de toute façon le problème vient avant la compilation du ContentPipeLineExtension, il trouve juste pas le chemin DSinsEngine.Level.
    Les propriétés du XML sont bonnes (No Processing, No Copy et ContentImporter = XML Content - XNA Framework).

    Une idée? J'ai chercher sur pas mal de forum je trouve pas

    EDIT : J'ai trouvé, apparement le dossier "Content" d'un projet possède ses propres références (ça m'apprendra à lire en diagonale)

  17. #17
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Citation Envoyé par ApheX2 Voir le message
    Merci pour ton lien yodaime, il m'a été très utile !
    De rien, il faut surtout remercier Gullix pour l'article.

  18. #18
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par yodaime Voir le message
    De rien, il faut surtout remercier Gullix pour l'article.
    C'est fait.

    Mais en faites il y a un truc que j'arrive pas à comprendre. J'ai virer tout le contenu des mes fonctions Write et read, mais j'arrive toujours à récupérer mon asset "name" quand je load mon level. Comment ça se fait? (j'ai tester en supprimant le .xnb dans bin/debug, il m'en regénère un correspondant à mon xml alors que mes LevelWriter et LevelReader sont vides)

  19. #19
    Membre averti Avatar de yodaime
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    282
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2006
    Messages : 282
    Points : 340
    Points
    340
    Par défaut
    Ce que tu appelles "asset name", c'est quoi exactement ? C'est le nom de ton niveau ?

  20. #20
    Membre régulier
    Inscrit en
    Août 2008
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 83
    Points : 76
    Points
    76
    Par défaut
    Oui, c'est le nom de mon niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?xml version="1.0" encoding="utf-8" ?>
    <XnaContent>
      <Asset Type="DSinsEngine.Sources.Level">
        <name>Level 1</name>  
    </Asset>
    </XnaContent>
    Et voici mon read avec lequel je fais le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class LevelReader : ContentTypeReader<TRead>
        {
            protected override TRead Read(ContentReader input, TRead existingInstance)
            {
                existingInstance.name = "zozo";
                //existingInstance.name = input.ReadString();
     
                return existingInstance;
            }
        }
    Dans tout les cas quand je trace l'attribut name de ma classe Level, il me renvoie "Level 1".

Discussions similaires

  1. [Débuter] [P2P] Architecture d'un jeu de plateau
    Par stalker8 dans le forum Réseau
    Réponses: 1
    Dernier message: 21/01/2012, 01h13
  2. [Tutoriel] Bug tuto 'Architecture d'un jeu vidéo 3D'
    Par Oxideur dans le forum Moteurs 3D
    Réponses: 5
    Dernier message: 14/09/2009, 22h16
  3. Question sur "Architecture d'un jeu vidéo 3D par Pierre Schwartz"
    Par TocTocKiéLà? dans le forum Développement 2D, 3D et Jeux
    Réponses: 6
    Dernier message: 01/09/2009, 22h31
  4. Question sur Architecture d'un jeu vidéo 3D
    Par Polygon dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 28/10/2007, 12h43

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