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 :

Affichage de map isométrique


Sujet :

XNA/Monogame

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Affichage de map isométrique
    Bonjour, voila j'expose mon problème, j'ai créé une fonction qui permet de lire un fichier en chargeant les textures et ce fichier contient aussi une "Map" sous forme de chiffre.

    Malheureusement ma carte doit être sous forme isométrique et je me heurte à un problème.
    Ma carte s'affiche anormalement :


    Voici le code de ma fonction draw
    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
      public void Draw(SpriteBatch spriteBatch)
            {
                for (int i = 0; i < map.Count; i++)
                {
                    for (int j = 0; j < map[i].Count; j++)
                    {
                        if (i == 0)
                            drawColor = Color.White;
                        else if (i == 1)
                            drawColor = Color.White;
                        spriteBatch.Draw(textures[map[i][j]],
                            new Vector2((j * textures[map[i][j]].Width), (i * textures[map[i][j]].Height)), drawColor);
                    }
                }
            }
    Je voudrais que ma carte soit affichée sans trou. Je sollicite ainsi votre aide.

    Que dois-je faire dans ma fonction pour que ma carte s'affiche normalement en isométrique ?

    Merci
    Images attachées Images attachées  

  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
    Avec un petit décalage une ligne sur deux tout ira mieux
    Suivez le développement de Chibis Bomba
    twitter : https://twitter.com/MoD_DiB
    DevBlog : http://moddib.blogspot.fr/

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci mais pourrais-tu m'expliquer comment faire pour avoir un décalage à chaque ligne?

    Car j'ai essayer mais sa ma décale à chaque ligne.

  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 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Comme le signale MoDDiB, la seconde ligne de la carte est décalé de TileWidht/2 sur l'axe des X et TileHeight/2 sur l'axe des Y. Une fois cette correction effectué, votre carte n'aura pas de trous.
    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    J'ai essayer de modifier ma fonction pour que cela se décale une fois sur deux mais malheureusement je n'y arrive pas. Soit tout se décale au fur et à mesure de la boucle soit les textures se chevauchent...

    Pouvez-vous m'expliquer ce qu'il faudrait que je modifie dans mes boucles afin que cela ce décale une fois sur deux?

    Merci

    PS : je débute en C# et avec XNA, donc j'essaye de comprendre un maximum mais la je butte vraiment.

  6. #6
    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 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Pour le for qui gère les Y (quel idée d'appeler les variables i et j, alors que ce sont des x et y), il faut incrémenter que de la moitié de la taille de la texture.
    Pour le for qui gère les X, il faut que la coordonnée de départ soit décalé de la largeur de la texture divisée par deux, si le Y est pair. Sinon, il n'y a pas besoin d'un tel décalage.
    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.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci de ton aide. Mais malheureusement, dès que j'applique ce que tu me conseils, mes textures se chevauchent toutes...

    Je n'arrive pas à gérer le décalage en fonction de chaque ligne. j'ai beau refaire ma fonction je n'arrive toujours pas à combler ces trous...


    EDIT : j'ai modifier mon code mais je me retrouve avec des trous dans un autre sens.

    Voici mon code :
    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
    public void Draw(SpriteBatch spriteBatch)
            {
                for (int row = 0; row < map.Count; row++)
                //On dessine une carte de 32 tuiles de large...
                {
                    for (int column = 0; column < map[row].Count; column++)//...sur 32 tuiles de haut
                    {
                        Texture2D texture = textures[map[row][column]];
     
     
                        bool isEvenTile = column % 2 == 0;//Est-ce que la tuile en cours est une tuile sur un index pair pour X?
     
                        int width = texture.Width;//La largeur
                        int height = texture.Height;//La hauteur
     
                        int x = isEvenTile ? Math.Max(1, (row /*+ 1*/) * width) : (row * width) - width / 2;//Si c'est une tuile pair, pas de modif, si c'est impair on enlève la moitié de la largeur (pour reculer l'image carré sur X et faire coller le losange)
     
                        int y = isEvenTile ? Math.Max(1, column * height) : ((column /*+ 1*/) * height) - height / 2;//Si c'est une tuile pair, pas de modif, si c'est impair on ajoute la moitié de la hauteur (pour descender l'image carré sur Y et faire coller le losange)
     
                        spriteBatch.Draw(texture, new Vector2(x, y), Color.White);
                    }
                }
    voila ce que sa donne :

    Images attachées Images attachées  

  8. #8
    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 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Houlà, je ne voyais pas cela comme ça.
    De base, l'affichage d'un tiling simple, c'est deux for imbriqué. Ici, cela reste de même, sauf que le point de départ de X, dépend de si Y est paire ou non.
    Et je crois que c'est tout
    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.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Oui je voyais pas ça comme ça non plus mais voici le code final de la fonction :
    public void Draw(SpriteBatch spriteBatch)
    {
    for (int row = 0; row < map.Count; row++)
    {
    for (int column = 0; column < map[row].Count; column++)
    {
    Texture2D texture = textures[map[row][column]];

    int width = texture.Width;//La largeur
    int height = texture.Height;//La hauteur

    int x = (column * width) / 2;
    int y = row * height + ((column % 2) * (height / 2));


    spriteBatch.Draw(texture, new Vector2(x, y), Color.White);
    }
    }
    }
    mais bon j'ai réussi grâce à de l'aide et puis je laisse cela ici afin d'aider d'autre personne si besoin est.

    Merci encore

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

Discussions similaires

  1. [Google Maps] Affichage de map avec plusieurs markers et une InfoWindow par marker
    Par yesenia dans le forum APIs Google
    Réponses: 5
    Dernier message: 20/12/2016, 14h53
  2. affichage de map view
    Par anastunisie dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 27/04/2011, 15h20
  3. [IE 8] Problème affichage Google Maps
    Par Sekigawa dans le forum IE
    Réponses: 3
    Dernier message: 08/09/2010, 14h59
  4. Affichage tiles - moteur isométrique
    Par helitik dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 17/01/2010, 19h57
  5. Affichage google maps
    Par michel.di dans le forum API standards et tierces
    Réponses: 12
    Dernier message: 24/07/2009, 13h38

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