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

SFML Discussion :

TileMap sur SFML 2.3 [SFML 2.0]


Sujet :

SFML

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut TileMap sur SFML 2.3
    Bonjour,

    Je suis en dut info 1ère année et je dois réaliser un Rogue Like avec quelqu’un. On a décidé d'utilisé SFML pour la partie graphique.
    Je me suis attaqué à la génération de la map. En soit, j'ai quasiment réussi car j'ai réussi à importer les données de mon fichier texte à mon tableau. Ensuite, je me suis trés largement inspiré du tuto sur le site de SFML pour passer de mon tableau au rendu graphique.

    Lorsque je compile,mon tableau est reconnu et j'arrive à l'afficher, par contre, une fois que le bout de code sur le site de SFML vient à son tour parcourir le tableau il y a un hic ... J'ai des valeurs énormes alors que mon tableau ne contient que des 0 et des 1. Je n'arrive vraiment pas a comprendre d'où cela pourrait venir ...

    Voilà mon code :
    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
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <SFML/Graphics.hpp>
    #include <cstring>
    #include <iostream>
    #include <fstream>
     
    using namespace std;
    using namespace sf;
     
    #include "tileMap.hpp"
    int main()
    {
        RenderWindow window(VideoMode(512, 256), "Tilemap");
     
        string niveau;
        int Y, X;
        ifstream fichier("test.txt");
     
        fichier >> niveau >> X >> Y;
        cout << " nom niveau "<< niveau << " " << " nb ligne " << X << " " << " nb colonne " << Y << endl << endl;
        int level[X*Y];
     
        for(int i=0; i<Y;i++)
        {
            for(int y=0;y<X;y++)
            {
                fichier >> level[y];
                cout<<level[y];
            }
            cout <<endl;
        }
     
     
        // on crée la tilemap avec le niveau précédemment défini
        TileMap map;
        if (!map.load("wall.png", Vector2u(32, 32), level, X, Y))
            return -1;
     
        // on fait tourner la boucle principale
     
        while (window.isOpen())
        {
      Event event;
            while (window.pollEvent(event))
            {
                if(event.type == Event::Closed)
                    window.close();
            }
     
            window.clear();
            window.draw(map);
            window.display();
        }
     
        return 0;
    }
    tileMap.hpp
    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
     
     
    class TileMap : public Drawable, public Transformable
    {
    public:
     
        bool load(const string& tileset,Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
        {
            // on charge la texture du tileset
            if (!m_tileset.loadFromFile(tileset))
                return false;
     
            // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
            m_vertices.setPrimitiveType(Quads);
            m_vertices.resize(width * height * 4);
     
            // on remplit le tableau de vertex, avec un quad par tuile
             for (unsigned int i = 0; i < width; ++i)
                for (unsigned int j = 0; j < height; ++j)
                {
                    // on récupère le numéro de tuile courant
                    int tileNumber = tiles[i + j * width];
     
                    // on en déduit sa position dans la texture du tileset
                    int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
                    int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
     
                    // on récupère un pointeur vers le quad à définir dans le tableau de vertex
                    Vertex* quad = &m_vertices[(i + j * width) * 4];
     
                    // on définit ses quatre coins
                    quad[0].position = Vector2f(i * tileSize.x, j * tileSize.y);
                    quad[1].position = Vector2f((i + 1) * tileSize.x, j * tileSize.y);
                    quad[2].position = Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
                    quad[3].position = Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
     
                    // on définit ses quatre coordonnées de texture
                    quad[0].texCoords = Vector2f(tu * tileSize.x, tv * tileSize.y);
                    quad[1].texCoords = Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
                    quad[2].texCoords = Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
                    quad[3].texCoords = Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
                }
     
            return true;
        }
     
    private:
     
        virtual void draw(RenderTarget& target, RenderStates states) const
        {
            // on applique la transformation
            states.transform *= getTransform();
     
            // on applique la texture du tileset
            states.texture = &m_tileset;
     
            // et on dessine enfin le tableau de vertex
            target.draw(m_vertices, states);
        }
     
        VertexArray m_vertices;
        Texture m_tileset;
    };
    J’espère avoir était suffisamment clair dans mes explications !

    J'attend vos réponses impatiament

  2. #2
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     for(int i=0; i<Y;i++)
        {
            for(int y=0;y<X;y++)
            {
                fichier >> level[y];
                cout<<level[y];
            }
            cout <<endl;
        }
    C'est pas level[i * y] à la place de level[y] ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Re,

    Je viens de faire le test sa ne change rien :/
    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
     
     
    class TileMap : public Drawable, public Transformable
    {
    public:
     
        bool load(const std::string& tileset,Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
        {
            // on charge la texture du tileset
            if (!m_tileset.loadFromFile(tileset))
                return false;
     
            // on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
            m_vertices.setPrimitiveType(Quads);
            m_vertices.resize(width * height * 4);
     
            // on remplit le tableau de vertex, avec un quad par tuile
             for (unsigned int i = 0; i < width; ++i)
                for (unsigned int j = 0; j < height; ++j)
                {
                    // on récupère le numéro de tuile courant
                    int tileNumber = tiles[i + j * width];
                    cout << tileNumber << " ";
     
                    // on en déduit sa position dans la texture du tileset
                    int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
                    int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
     
                    // on récupère un pointeur vers le quad à définir dans le tableau de vertex
                    Vertex* quad = &m_vertices[(i + j * width) * 4];
     
                    // on définit ses quatre coins
                    quad[0].position = Vector2f(i * tileSize.x, j * tileSize.y);
                    quad[1].position = Vector2f((i + 1) * tileSize.x, j * tileSize.y);
                    quad[2].position = Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
                    quad[3].position = Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
     
                    // on définit ses quatre coordonnées de texture
                    quad[0].texCoords = Vector2f(tu * tileSize.x, tv * tileSize.y);
                    quad[1].texCoords = Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
                    quad[2].texCoords = Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
                    quad[3].texCoords = Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
                }
     
            return true;
        }
     
    private:
     
        virtual void draw(RenderTarget& target, RenderStates states) const
        {
            // on applique la transformation
            states.transform *= getTransform();
     
            // on applique la texture du tileset
            states.texture = &m_tileset;
     
            // et on dessine enfin le tableau de vertex
            target.draw(m_vertices, states);
        }
     
        sf::VertexArray m_vertices;
        sf::Texture m_tileset;
    };
    J'ai ajouté un cout << tileNumber << " "; pour pouvoir voir quelle valeur était prise lorsque la boucle parcours le tableau et sa ne change rien si je met mon tableau en [y*i] ou [y] lors de ma première boucle (pour récupérer la map sur le fichier texte). Au final j'ai toujours de valeurs type 9203264 et autres énormités qui viennent se greffer à la place de mes 0 ou 1 ...

    Merci de ta réponse en tout cas !

  4. #4
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Oui, mais je me suis planté
    Citation Envoyé par Cirrus Minor Voir le message
    C'est pas level[i * y] à la place de level[y] ?
    Essaie: level[i * X + y] à la place de level[y].

    EDIT: Les valeurs "énormes", ce sont des valeurs de ton tableau que tu n'as pas initialisées et qui n'ont pas été remplies par ta double boucle.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Parfait un GRAND merci !!

    A une prochaine fois peut être

  6. #6
    Membre émérite Avatar de Cirrus Minor
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2014
    Messages
    953
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2014
    Messages : 953
    Points : 2 612
    Points
    2 612
    Par défaut
    Cool, ça marche ! Tu as bien compris quelle était l'erreur ?

    Par contre, dans un roguelike, les niveaux sont générés aléatoirement, ils ne sont pas lus dans un fichier !
    Est-ce que tu vas utiliser des algorithmes de génération procédurale, ou restes-tu sur des niveaux créés "manuellement" ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Oui oui. En gros je parcourais mal mon tableau du coup j'initialisais pas toute mes cases (vu que je prenais en compte ni la première boucle de parcours).

    Ben disons qu'on doit créer un rogue like où chacun va pouvoir créer sa propre aventure. D'où le système de fichier ect ... Du coup je reste sur des niveaux créé à la main oui !

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

Discussions similaires

  1. Question sur les couleurs et la SFML
    Par deubelte dans le forum SFML
    Réponses: 0
    Dernier message: 26/12/2009, 22h27
  2. [SFML] - Appui sur deux touches simultanément
    Par skysee dans le forum SFML
    Réponses: 1
    Dernier message: 17/09/2008, 09h30
  3. [SFML]scrolling & tilemap
    Par Bibicy dans le forum SFML
    Réponses: 4
    Dernier message: 11/02/2008, 01h27
  4. [SFML] Compilation avec VC express sur Vista
    Par tomu dans le forum SFML
    Réponses: 5
    Dernier message: 01/09/2007, 09h18

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