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

Bibliothèques C++ Discussion :

[SFML]Problème Tile Mapping


Sujet :

Bibliothèques C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Charvalos
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 356
    Par défaut [SFML]Problème Tile Mapping
    Bonjour tout le monde !

    J'ai un petit problème de boucle et je dois dire que je n'y comprends plus rien ....

    Voici le code fautif :

    Map.cpp
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    //Fonction qui permet d'afficher la map
    void Map::afficheMap(Sprite &spriteMur, Sprite &spriteCaisse, Sprite &spriteMario, RenderWindow &fenetre)
    {
        //Map
        map =
            {
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,MUR},
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,MARIO,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,MUR,0,0,0},
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,0},
            {0,0,0,0,0,0,0,0,0,CAISSE},
            };
     
        //Parcourt de la map pour afficher les sprites correspondant
        for(int i = 0; i < NB_TILE_LARGEUR; i++)
        {
            for(int j = 0; j < NB_TILE_LONGUEUR; j++)
            {
                if(map[i][j] == MUR)
                {
                    spriteTexture = spriteMur;
                    spriteTexture.SetPosition(i * LARGEUR_TILE, j * LONGUEUR_TILE);
                    fenetre.Draw(spriteTexture);
                    cout << "i : " << i << "j : " << j << endl;
                }/*
                else if(map[i][j] == CAISSE)
                {
                    spriteTexture = spriteCaisse;
                    spriteTexture.SetPosition(i * LARGEUR_TILE, j * LONGUEUR_TILE);
                    fenetre.Draw(spriteTexture);
                    cout << "Pasage CAISSE [i][j] [" << i << "][" << j << "]" << endl;
                }
                else if(map[i][j] == MARIO)
                {
                    spriteTexture = spriteMario;
                    spriteTexture.SetPosition(i * LARGEUR_TILE, j * LONGUEUR_TILE);
                    fenetre.Draw(spriteTexture);
                    cout << "Pasage MARIO [i][j] [" << i << "][" << j << "]" << endl;
                }*/
            }
        }
    }
    Map.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Map
    {
        public:
     
        Map();
        ~Map();
        void afficheMap(Sprite &spriteMur, Sprite &spriteCaisse, Sprite &spriteMario, RenderWindow &fenetre);
     
        private:
     
        Sprite spriteTexture;
        int map[NB_TILE_LARGEUR][NB_TILE_LONGUEUR];
    };
    Après plusieurs tests, il vient bien dans le premier if, m'affiche un seul mur (alors que je devrais en avoir 2) et boucle infiniment et je ne sais pas pourquoi

    A l'affichage dans la commande des valeurs de i et j, j'ai ceci :

    i : 1
    j : 9

    i : 6
    j : 6

    Ces 2 duos de nombres se répètent à l'infini..

    Merci d'avance pour vos réponses.

    P.S: J'essaye de faire un Mario Sokoban.

  2. #2
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    A première vue, le code à l'air correct.

    Montre ton appel, les déclarations de tes constantes stp.

  3. #3
    Membre éclairé Avatar de Charvalos
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 356
    Par défaut
    Voilà :

    main.cpp
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    #include "Mario.h"
    #include "Caisse.h"
    #include "Constantes.h"
    #include "Map.h"
     
    int main(int argc, char** argv)
    {
        //Création de la fenêtre
        RenderWindow fenetre(VideoMode(LONGUEUR_FENETRE, LARGEUR_FENETRE, AFFICHAGE_BITS), "Mario Sokoban");
     
        /* --- Création des différents objets --- */
        Mario mario;
        Caisse caisse("caisse.png");
        Mur mur("mur.png");
        Map map;
     
        //Test pour savoir si l'affectation du sprite a échouée
        if(!mario.affecteSprite("mario_droite.png"))
        {
            return EXIT_FAILURE;
        }
     
        Sprite spriteMur = mur.getSprite();
        Sprite spriteCaisse = caisse.getSprite();
        Sprite spriteMario = mario.getSprite();
     
        while(fenetre.IsOpened())
        {
            Event event;
     
            while(fenetre.GetEvent(event))
            {
                switch(event.Type)
                {
                    case Event::Closed:
                        fenetre.Close();
                        break;
     
                    //Gestion des événements des touches
                    case Event::KeyPressed:
                    {
                        switch(event.Key.Code)
                        {
                            case Key::Escape:
                                fenetre.Close();
                                break;
     
                            case Key::Right:
                                mario.affecteSprite("mario_droite.png");
                                mario.avancerDroite(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Left:
                                mario.affecteSprite("mario_gauche.png");
                                mario.avancerGauche(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Down:
                                mario.affecteSprite("mario_bas.png");
                                mario.descendre(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Up:
                                mario.affecteSprite("mario_haut.png");
                                mario.monter(VITESSE_DEPLACEMENT);
                                break;
                        }
                    }
                }
            }
     
            fenetre.Clear();
            map.afficheMap(spriteMur, spriteCaisse, spriteMario,fenetre);
            fenetre.Display();
        }
     
        return EXIT_SUCCESS;
    }
    Constantes.h
    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
    27
    28
    29
     
    /*
    --- Fichier contenant les #define et les #include
    */
     
    #ifndef CONSTANTES_H_INCLUDED
    #define CONSTANTES_H_INCLUDED
     
    #define LARGEUR_FENETRE 600
    #define LONGUEUR_FENETRE 800
    #define AFFICHAGE_BITS 32
    #define VITESSE_DEPLACEMENT 10
    #define LONGUEUR_TILE 80
    #define LARGEUR_TILE 60
    #define NB_TILE_LONGUEUR 10
    #define NB_TILE_LARGEUR 10
    #define MUR 1
    #define CAISSE 2
    #define MARIO 3
     
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <string>
    #include <vector>
     
    using namespace std;
    using namespace sf;
     
    #endif // CONSTANTES_H_INCLUDED
    Dans Map.cpp, j'inclue bien Constantes.h et Map.h

  4. #4
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Bon
    Déjà c'est normal que ça boucle à l'infinie, vu que tu appels ta méthode dans une boucle infinie.

    Pour le coup du mur, je suis en train de regarder, mais je crois que tu as un problème de référence.

  5. #5
    Membre éclairé Avatar de Charvalos
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2010
    Messages : 356
    Par défaut
    J'avais oublié la boucle infinie du début.

    Enfin, voilà, j'ai modifié mon code comme ceci :

    main.cpp
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include "Mario.h"
    #include "Caisse.h"
    #include "Constantes.h"
    #include "Map.h"
    #include "Mur.h"
     
    int main(int argc, char** argv)
    {
        //Création de la fenêtre
        RenderWindow fenetre(VideoMode(LONGUEUR_FENETRE, LARGEUR_FENETRE, AFFICHAGE_BITS), "Mario Sokoban");
     
        /* --- Création des différents objets --- */
        Mario mario;
        Caisse caisse("caisse.png");
        Mur mur("mur.png");
        Map map;
     
        //Test pour savoir si l'affectation du sprite a échouée
        if(!mario.affecteSprite("mario_droite.png"))
        {
            return EXIT_FAILURE;
        }
     
        Sprite spriteMur = mur.getSprite();
        Sprite spriteCaisse = caisse.getSprite();
        Sprite spriteMario = mario.getSprite();
     
        map.afficheMap(spriteMur, spriteCaisse, spriteMario,fenetre);
     
        while(fenetre.IsOpened())
        {
            Event event;
     
            while(fenetre.GetEvent(event))
            {
                switch(event.Type)
                {
                    case Event::Closed:
                        fenetre.Close();
                        break;
     
                    //Gestion des événements des touches
                    case Event::KeyPressed:
                    {
                        switch(event.Key.Code)
                        {
                            case Key::Escape:
                                fenetre.Close();
                                break;
     
                            case Key::Right:
                                mario.affecteSprite("mario_droite.png");
                                mario.avancerDroite(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Left:
                                mario.affecteSprite("mario_gauche.png");
                                mario.avancerGauche(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Down:
                                mario.affecteSprite("mario_bas.png");
                                mario.descendre(VITESSE_DEPLACEMENT);
                                break;
     
                            case Key::Up:
                                mario.affecteSprite("mario_haut.png");
                                mario.monter(VITESSE_DEPLACEMENT);
                                break;
                        }
                    }
                }
            }
     
            fenetre.Clear();
            fenetre.Display();
        }
     
        return EXIT_SUCCESS;
    }
    Le problème, c'est qu'il ne m'affiche plus rien maintenant et quand je regarde les valeurs de i et de j, j'ai les suivantes :

    i : 1
    j : 9

    i : 6
    j : 6

    Ce que je comprend pas, c'est que dans ma boucle je fait un i++ et dans l'autre un j++ et là, il passe 2x fois dans la boucle et i vaut 1 et 6 et j vaut 9 et 6.

    C'est pas normal non ?

  6. #6
    Membre chevronné Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Par défaut
    Vu que tu fais ton cout dans le if (donc uniquement si la case en (i, j) est un mur), c'est normal qu'il n'affiche que les coordonnées des murs.

    A vérifier dans la doc de la SFML, mais on me souffle dans l'oreillette que les sprites ne s'utilisent qu'une fois. Il faut donc que chaque case porte un sprite!

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

Discussions similaires

  1. Problème avec Tile mapping
    Par helio500 dans le forum SFML
    Réponses: 5
    Dernier message: 31/08/2014, 21h53
  2. [Débutant] Problème de mapping des ports
    Par zehle dans le forum VHDL
    Réponses: 1
    Dernier message: 22/05/2006, 22h37
  3. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  4. [CASTOR]Problème de mapping de données
    Par chuck norris dans le forum Persistance des données
    Réponses: 1
    Dernier message: 13/07/2005, 22h01
  5. [Struts] Problème de mapping
    Par ArseNic dans le forum Struts 1
    Réponses: 5
    Dernier message: 10/02/2005, 10h11

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