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 :

[XNA] Gérer profondeur image


Sujet :

XNA/Monogame

  1. #1
    Invité
    Invité(e)
    Par défaut [XNA] Gérer profondeur image
    Bonjour,

    Je travaille en ce moment sur un petit jeux (rien de grandiose ^^) en 3D iso.

    J'ai une classe Heros dans laquelle je gère mon héros notamment en chargeant une image avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.textureHomerF = this.content.Load<Texture2D>("Content/Sprite/homerF");
    Mon problème est que je charge aussi des ennemis dans une autre classe et le héros doit parfois être devant, et d'autres fois derrière les ennemis.

    Y a t'il un moyen de gérer une profondeur (depth) ?

    Petite exemple: les + représente mon héros haut de 2 cases, les $ mes ennemis haut de 2 cases et large de 2 aussi et les * des cases vides.

    ****************
    *****+**********
    *****$$*********
    *****$$*********
    **************** Ici, mon héros doit apparaître derrière l'ennemi



    ****************
    *****$$*********
    *****+$*********
    *****+**********
    **************** Ici, mon héros doit apparaître devant l'ennemi
    Dernière modification par Invité ; 15/04/2008 à 19h33.

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Kilay Voir le message
    Bonjour,

    Je travaille en ce moment sur un petit jeux (rien de grandiose ^^) en 3D iso.

    J'ai une classe Heros dans laquelle je gère mon héros notamment en chargeant une image avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.textureHomerF = this.content.Load<Texture2D>("Content/Sprite/homerF");
    Mon problème est que je charge aussi des ennemis dans une autre classe et le héros doit parfois être devant, et d'autres fois derrière les ennemis.

    Y a t'il un moyen de gérer une profondeur (depth) ?
    SpriteBatch.Draw() (je présume que c'est ce que tu utilises) possède deux overloads (celui-ci et celui-ci) qui te permettent de spécifier un "niveau de profondeur" au moment du rendu des sprites. La valeur layerDepth a spécifier est >=0.0 (premier plan), <=1.0 (arrière plan).

    L'autre solution consiste à dessiner les sprites dans l'ordre. Tu peux jouer avec les overloads de SpriteBatch.Begin pour t'aider.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    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 361
    Points : 20 381
    Points
    20 381
    Par défaut
    A moins que XNA ne gère cela automatiquement ( je ne connais pas XNA) la technique c'est d'utiliser des layers ou couches graphiques et de les trier selon l'ordre,le sens de représentation par exemple du haut vers le bas..
    donc sur une couche graphique tu dessines ton personnage sur un autre les objets d'avant plan une autre les monstres et une dernière les objets d'arrière plan.
    Après il faut effectuer un tri pour déterminer quelle couche s' affiche avant les autres...

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    A moins que XNA ne gère cela automatiquement ( je ne connais pas XNA) la technique c'est d'utiliser des layers ou couches graphiques et de les trier selon l'ordre,le sens de représentation par exemple du haut vers le bas..
    donc sur une couche graphique tu dessines ton personnage sur un autre les objets d'avant plan une autre les monstres et une dernière les objets d'arrière plan.
    Après il faut effectuer un tri pour déterminer quelle couche s' affiche avant les autres...
    Étonnamment, c'est le sujet du dernier post de mon blog.

    Ceci était un communiqué publicitaire gratuit et posté sans aucune honte.

    A noter que SpriteBatch a la possiblité de gérer l'ordre de dessin, mais uniquement dans le cadre du même bloc Begin()/End() (End() provoquant le dessin des sprites).

    Le pseudo-code ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SpriteBatch.Begin()
    SpriteBatch.Draw(monSprite1, depthLayer = 0) // FRONT
    SpriteBatch.End()
    SpriteBatch.Begin()
    SpriteBatch.Draw(monSprite2, depthLayer = 1) // BACK
    SpriteBatch.End()
    Dessine monSprite2 par dessus monSprite1, malgré la définition du depthLayer qui nous dit le contraire.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour les réponses, je vais tester ca et mettrais [Résolu] si j'yarrive

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai essayer en surchargeant la méthode SpriteBatch.Draw() mais ce la ne marche pas non plus.
    Cela peut il venir du fait que je créer un nouveau ContentManager dans chacune de mes classes ?

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Kilay Voir le message
    J'ai essayer en surchargeant la méthode SpriteBatch.Draw() mais ce la ne marche pas non plus.
    Cela peut il venir du fait que je créer un nouveau ContentManager dans chacune de mes classes ?
    2 cas:
    1) ta boucle de dessin ressemble conceptuellement à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    batch.Begin();
    foreach (Sprite s in sprites)
    {
      batch.Draw(s);
    }
    batch.End()
    Dans ce cas, tu peux gérer la profondeur via le paramètre depthLayer de SpriteBatch.Draw().

    2) ta boucle ressemble conceptuellement à celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach (Sprite s in sprites)
    {
      batch.Begin();
      batch.Draw(s);
      batch.End()
    }
    Dans ce cas, tu ne peux pas utiilser depathLayer. Il te faux ordonner toi même les sprites dans l'ordre que tu souhaites les dessiner.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  8. #8
    Membre actif Avatar de Luffy49
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 399
    Points : 247
    Points
    247
    Par défaut
    je programme aussi en XNA et j'ai rencontrer ton probleme.

    Si tu code "bien" tu a du faire une classe DrawableGameComponant pour ton hero et une autre pour ton enemie.

    Tu les instancie et tu doit faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Components.add(myhero);
    Components.add(myenemi);
    pour gerer l'ordre d'affiche des objets pas plus simple que celà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    myhero.DrawOrder = 1;
    myenemi.DrawOrder = 2;
    ici l'enemie sera afficher après le hero donc il sera dessus voilà tous simplement

    ps : l'order de l'update peut aussi être gérer par UpdateOrder
    La connaissance n'est rien si elle n'est pas partagé

    Citation de Confucius :
    Ceux dont la connaissance est innée sont des hommes tout à fait supérieurs. Puis viennent ceux qui acquièrent cette connaissance par l'étude. Enfin, ceux qui, même dans la détresse, n'étudient pas : c'est le peuple.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci Luffy, exactement ca ^^

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Luffy49 Voir le message
    je programme aussi en XNA et j'ai rencontrer ton probleme.

    Si tu code "bien" tu a du faire une classe DrawableGameComponant pour ton hero et une autre pour ton enemie.
    Pour ma part, je ne dirais pas que c'est du code "bien" pensé : que se passe-t-il si tu as besoin de 75 sprites représentant des entités différentes ? Dans ce design, tu te retrouves avec 75 DrawableGameComponent, ce qui n'est pas vraiment une idée grandiose (enfin si, elle l'est. Par la taille...)

    L'idée de base des GameComponent a évolué dans le temps depuis la première version du Framework XNA. En ces temps immémoriaux, les composants étaient dirigés par le designer, et la tentation de lier entités et composant était forte (et hop! un composant sprite ici!). Cette notion ayant été supprimée de XNA, les composants se retrouvent avec une nouvelle vie bien à eux. Ils ont alors pour but de représenter des fonctionnalités (d'où la présence de composants qui ne sont pas drawable), et non pas des entités. L'une de ces fonctions est la gestion du modèle du jeu. Une autre est la transformation modèle -> vue, et donc l'affichage du modèle. Dans ce cadre, point n'est besoin d'avoir un composant par sprite - on peut tout à fait gérer l'ensemble des sprites d'une catégorie dans un seul composant graphique.

    Pour un jeu 2D, voici l'architecture de GameComponent que je préconise:

    1) Capture des entrées utilisateur, et mapping de ces entrées vers des actions
    2) Mise à jour du modèle de données
    3) Affichage du background (graphique)
    4) Affichage des entités dynamiques / sprites (graphique)
    5) Affichage du foreground (graphique)
    6) Affichage de l'interface utilisateur (graphique)

    On peut rajouter (en 2.5) la gestion de la musique et des effets spéciaux sonores. D'autres composants peuvent être utilisés pour gérer des effets graphiques supplémentaires (post-process, etc).

    Pour un jeu 3D, un concept similaire peut être employé.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #11
    Invité
    Invité(e)
    Par défaut
    J'avoue que ce n'est pas le plus "propre".
    Mais par contre niveau ressource et charge mémoire/cpu, cela revient au même nan ?

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Kilay Voir le message
    J'avoue que ce n'est pas le plus "propre".
    Mais par contre niveau ressource et charge mémoire/cpu, cela revient au même nan ?
    Non. Mais la différence n'est pas forcément notable au niveau de la mémoire (on est pas à 1Ko prêt, ni même ) 10Ko d'ailleurs), elle peut l'être au niveau du temps CPU utilisé - notamment parce que, comme je l'ai décrit dans mon article, le parcours des GameComponent est tout sauf trivial; si il avait été trivial, le problème CPU serait bien moindre. Ainsi, la complexité algorithmique globale du code de rendu ne change pas, mais ça ne veut pas dire que le temps d'exécution reste le même.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. [D5][SQL Server] Conserver des images dans la BDD
    Par FONKOU dans le forum Bases de données
    Réponses: 8
    Dernier message: 08/06/2008, 19h58
  2. Réponses: 1
    Dernier message: 01/04/2008, 18h31
  3. [Upload] Comment gérer les images ?
    Par calenfeaion dans le forum Langage
    Réponses: 2
    Dernier message: 01/05/2007, 18h20
  4. [VB6] Comment gérer les images d'un projet
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 20/04/2006, 17h28
  5. [MySQL] conseils pour gérer des images avec mysql
    Par briiice dans le forum Administration
    Réponses: 9
    Dernier message: 04/01/2006, 09h52

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