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

Auteur Sujet: Problème bizarre  (Lu 2122 fois)

0 Membres et 3 Invités sur ce sujet

lolpuppy

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Problème bizarre
« le: Mars 02, 2014, 02:35:05 am »
Bonjour, je commence lentement à me familliariser la bibliothèque SFML et je viens de tomber sur un drôle de problème. Premièrement, rien ne s'affichait lorsque je faisais marcher le programme. Après avoir fait quelques tests, j'ai observé que la taille de mes "tuiles" était de 1761751040 alors que je ne fais rien qui pourrait changer la valeur de la variable. Ce que je cherche à faire présentement est simplement une classe "carte" qui pourrait me servir éventuellement. Elle est composée de multiples carrés. J'ai beau avoir cherché, je n'ai pas trouvé la source de mon erreur... Des idées?
Voici le code
Mon main
int main()
{
    const int taille(15);
    const int tailleYTableau(1);
    const int tailleXTableau(2);
    const std::string chemin("water.jpg");

    carte c(tailleXTableau, tailleYTableau, taille, sf::Color::Green);

    //Création de la fenêtre
    sf::RenderWindow window(sf::VideoMode(800, 600), "My window");


    // on fait tourner le programme tant que la fenêtre n'a pas été fermée
    while (window.isOpen())
    {
        // on traite tous les évènements de la fenêtre qui ont été générés depuis la dernière itération de la boucle
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        window.clear(sf::Color::Black);

        c.afficher(window);

        window.display();
        window.close();
    }

    return 0;
}
ma classe Map
carte::carte()
{
    //grille = new std::vector <tuile>;
    m_hauteur = 0;
    m_largeur = 0;
    m_taille = 0;
    update();
}
carte::carte(int hauteur, int largeur, int taille)
{
    //grille = new std::vector <tuile>;
    m_hauteur = hauteur;
    m_largeur = largeur;
    m_taille = taille;
    update();
}
carte::carte(int hauteur, int largeur, int taille, sf::Color base)
{
    //grille = new std::vector <tuile>;
    m_hauteur = hauteur;
    m_largeur = largeur;
    m_taille = taille;
    m_couleurBase = base;
    update();
}
carte::~carte() // ok
{
    //delete grille;
}

void carte::afficher(sf::RenderWindow &window)
{
     for(int i(0); i < m_hauteur * m_largeur; i++)
    {
        grille[i].afficher(window);
        grille[i].infos();
    }

}

tuile* carte::creerTuile(int positionX, int positionY, int taille)
{
    tuile t1(taille, sf::Vector2f(positionX, positionY), m_couleurBase);
    tuile *i(&t1);
    return i;
}

void carte::update()
{
    int x, y, nbTotal;
    nbTotal = m_largeur * m_hauteur;
    //delete grille;
    //grille = new std::vector <tuile>;
    grille.resize(m_hauteur * m_largeur);

    for(int i(0); i < nbTotal; i++)
    {
        x = calculerX(m_taille, m_largeur, i);
        y = calculerY(m_taille, m_largeur, i);
        //std::cout << "X : " << x << "  Y : " << y << std::endl;
        grille.push_back(tuile(m_taille, sf::Vector2f(x,y), m_couleurBase));
    }
}

 
et ma classe tuile
tuile::tuile()
{
    m_couleur = sf::Color::Green;
    m_libre = true;
}
tuile::tuile(int taille, sf::Vector2f position, sf::Color couleur)
{
    coordonnees = position;
    m_taille = taille;
    m_couleur = couleur;
    m_libre = true;

    m_forme.setPosition(coordonnees);
    m_forme.setSize(sf::Vector2f(m_taille, m_taille));
    m_forme.setFillColor(couleur);
    m_forme.setOutlineThickness(-1);
    m_forme.setOutlineColor(sf::Color::Black);

}
tuile::tuile(int taille, sf::Vector2f position)
{
    coordonnees = position;
    m_taille = taille;
    m_couleur = sf::Color::Green;
    m_libre = true;

    m_forme.setPosition(coordonnees);
    m_forme.setSize(sf::Vector2f(m_taille, m_taille));
    m_forme.setFillColor(m_couleur);
    m_forme.setOutlineThickness(-3);
    m_forme.setOutlineColor(sf::Color::Black);
}
tuile::tuile(int taille, sf::Vector2f position, std::string texture)
{
    coordonnees = position;
    m_taille = taille;
    m_couleur = sf::Color::Green;
    m_libre = true;

    m_forme.setPosition(coordonnees);
    m_forme.setSize(sf::Vector2f(m_taille, m_taille));
    m_forme.setOutlineThickness(-3);
    m_forme.setOutlineColor(sf::Color::Black);
    setTexture(texture);
}
tuile::~tuile()
{

}
bool tuile::libre()
{
    return m_libre;
}
void tuile::vider()
{
    m_forme.setFillColor(m_couleur);
    m_libre = true;
}
void tuile::setCouleur(sf::Color couleur)
{
    m_couleur = couleur;
    m_forme.setFillColor(couleur);
}
void tuile::setTaille(int taille)
{
    m_taille = taille;
    m_forme.setSize(sf::Vector2f(m_taille, m_taille));
}
void tuile::setCoordonnes(sf::Vector2f position)
{
    coordonnees = position;
}
void tuile::afficher(sf::RenderWindow &window)
{
    window.draw(m_forme);
}
void tuile::setTexture(std::string chemin)
{
    if(m_texture.loadFromFile(chemin, sf::IntRect(10,10, m_taille, m_taille)));
    {
        m_forme.setTexture(&m_texture);
        std::cout << "Plaquage de texture réussi!!" << std::endl;
    }
}
void tuile::infos()
{
    std::cout << "Taille : " << m_taille << std::endl;
    std::cout << "X : " << coordonnees.x << std::endl;
    std::cout << "Y : " << coordonnees.y << std::endl;
}
 

Ps : Certains bouts de code sont en commentaire, ce ne sont que des tests que j'ai voulu faire pour régler le problème ou ce sont des bouts de code que je tiens à garder même s'ils ne me sont pas utile. Merci  :)
Mon projet est téléchargeable ici : https://www.dropbox.com/s/agu3c3ndcyi6t3t/grillage.zip
« Modifié: Mars 02, 2014, 03:03:18 pm par lolpuppy »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème bizarre
« Réponse #1 le: Mars 02, 2014, 04:46:36 am »
J'vois pas de pièce jointe. ;)

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Problème bizarre
« Réponse #2 le: Mars 02, 2014, 11:49:55 am »
Bonjour,

À la fin de la boucle principale, il y a:
Citer
window.close();
Lors de la première itération, la fenêtre est fermée et la condition de la boucle n'est donc plus vérifiée. Le programme se termine.
Il faut retirer cette ligne.

lolpuppy

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Problème bizarre
« Réponse #3 le: Mars 02, 2014, 02:30:47 pm »
le problème n'est pas là, j'ai tout simplement mis une fin a mon programme, car j'ai placé des cout dans mes classe et je voulais éviter de les spammer pour que ce soit plus facile a lire.

J'ai changé le lien, on devrait maintenant pouvoir télécharger mon projet  :)
« Modifié: Mars 02, 2014, 03:03:57 pm par lolpuppy »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème bizarre
« Réponse #4 le: Mars 02, 2014, 08:53:41 pm »
Dans carte::update() tu fais un resize de ton vector, ça insère donc 2 tuiles dans le vector avec le constructeur par défaut, puis tu push_back tes 2 vrais tuiles. Tu as donc 4 tuiles, et quand tu affiches ta carte tu affiches les 2 premières, qui sont les 2 pas initialisées.

Donc soit tu push_back des nouveaux éléments dans un vector vide, soit tu resizes et tu accèdes directement aux éléments créés. Mais pas les 2. ;)

lolpuppy

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Problème bizarre
« Réponse #5 le: Mars 02, 2014, 11:46:07 pm »
J'ai réussi à régler le problème. Mais merci quand même, tu m'as fais découvrir une erreur logique dans mon code :)