Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème affichage sprite  (Lu 1966 fois)

0 Membres et 1 Invité sur ce sujet

Djesteur

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Problème affichage sprite
« le: Septembre 25, 2014, 08:03:52 pm »
Bonjour,

j'essaye d'afficher une carte en Tilemap, mais le programme plante lors de l'affichage (pas de problèmes lors de la compilation). Je pense que le problème viens lorsque je fait ma boucle dans Carte::draw, mais je n'arrive pas a trouver pourquoi  :-\

carte.cpp

#include <iostream>
#include <string>
#include <vector>
#include "Carte.h"

using namespace std;
using namespace sf;

Carte::Carte() {}
Carte::Carte(string lvlname) {

    if (!m_carte.loadFromFile(lvlname + ".png")) { cout << "Erreur chargement : carte" << endl; }
    if (!m_textures.loadFromFile(lvlname + "textures.bmp")) { cout << "Erreur chargement : textures" << endl; }

    int m_mapx (m_carte.getSize().x);
    int m_mapy (m_carte.getSize().y);
    cout << "m_mapx vaut :" << m_mapx << endl;
    cout << "m_mapy vaut :" << m_mapy << endl;

    vector <vector <Square> > m_tabText(m_mapx);

    for (int i (0); i < m_mapx; i++) {
        for (int j (0); j < m_mapy; j++) {
            m_tabText[i].push_back(Square(attributionText(i, j), m_textures, i, j));
        }
    }
}

Carte::~Carte() {}

int Carte::attributionText(int x, int y) {

    if (m_carte.getPixel(x, y) == Color::Black) {return 0;}
    else if (m_carte.getPixel(x, y) == Color::Red) {return 1;}
    else if (m_carte.getPixel(x, y) == Color::Green) {return 2;}
    else if (m_carte.getPixel(x, y) == Color::Blue) {return 3;}
    cout << "Mauvaise attribution de texture" << endl; return 3;
}

void Carte::draw(RenderWindow* app) {

    for (int i (0); i < m_mapx; i++) {
        for (int j (0); j < m_mapy; j++) {
                m_tabText[i][j].draw(app);
        }
    }
}
 

carte.h


#include <string>
#include <vector>
#include <SFML/Graphics.hpp>

#include "Square.h"

class Carte {

public:

    Carte();
    Carte(std::string lvlname);
    ~Carte();
    void draw(sf::RenderWindow* app);

private:

    int attributionText(int i, int j);

    std::string m_lvlname;
    std::vector <std::vector <Square> > m_tabText;

    sf::Image m_carte;
    sf::Texture m_textures;
    sf::Sprite m_sprite;

    int m_numTexture;
    int m_mapx;
    int m_mapy;
    int m_tabColor;
    int m_nbColor;

};

square.cpp

#include <iostream>
#include <SFML/Graphics.hpp>
#include "Square.h"

using namespace std;
using namespace sf;

Square::Square() {}
Square::Square(int numTexture, sf::Texture& textures, int x, int y) {
   
    m_sprite.setTexture(textures);
    m_sprite.setTextureRect(IntRect(50*numTexture, 1, 50, 50));
    m_sprite.setPosition(Vector2f(50*x, 50*y));
}
Square::~Square() {}

void Square::draw(RenderWindow* app) { app->draw(m_sprite); }
 

square.h

#include <string>
#include <vector>
#include <SFML/Graphics.hpp>

class Square {

public:

    Square();
    Square(int numTexture, sf::Texture& textures, int x, int y);
    ~Square();
    void draw(sf::RenderWindow* app);

private:

    sf::Texture m_textures;
    sf::Sprite m_sprite;
    int m_numTexture;
    int m_x;
    int m_y;


};
#endif
 

J'ai fait une classe square (google.trad de "case",  pas sur que se soit ce qu'il y ai de mieux) car j'aimerai faire un T-RPG, donc je vais avoir besoin de savoir si il y a déjà quelqu'un dessus, combien cela coûte en déplacement pour passer par cette case, etc...

Merci d'avance pour vos réponses.

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème affichage sprite
« Réponse #1 le: Septembre 25, 2014, 08:17:58 pm »
T'as 2 variables m_tabText, une locale au constructeur de Carte et que tu remplis, une membre de Carte et que t'essaies de dessiner en accedant à des indices qui n'existent pas.

Djesteur

  • Newbie
  • *
  • Messages: 14
    • Voir le profil
Re : Problème affichage sprite
« Réponse #2 le: Septembre 25, 2014, 08:37:17 pm »
Effectivement c'est pas terrible pour aller chercher l'affichage des sprites ;D
Mais du coup, si je supprime la variable qui est dans le constructeur, je ne l'initialise plus avec m_mapx et donc j’essaye juste en dessous d’accéder à des cases que mon vector ne connait pas. Or, si je supprime m_tabText qui est dans la déclaration de la classe, la fonction draw ne connait plus la variable ( et donc essayer d'afficher du vide donnera ... rien du tout) .
Y a t'il donc un moyen d'initialiser un vector 2d sans pour autant redéclarer la variable m_tabText ?

Edit : Bon en fait un simple  m_tabText.resize (m_mapx) avant la boucle était suffisant. Mais l'écran reste noir, sans aucune texture affichée  :-\

Edit 2: En fait j'ai refait la même erreur qu'au dessus, je déclare 2 fois m_mapx et m_mapy :P. Merci G. .
« Modifié: Septembre 26, 2014, 06:16:16 pm par Djesteur »

 

anything