Forum de la communauté SFML

Aide => Général => Discussion démarrée par: Magic le Avril 03, 2012, 05:15:45 pm

Titre: SFML 2, problème texture
Posté par: Magic le Avril 03, 2012, 05:15:45 pm
Bonjour,
Je code actuellement un jeu, et je fais une classe pour gérer toutes les textures. Voila un code qui doit charger une texture et la donner à un sprite.
#include "graphic_manager.hpp"

int main()
{
    sf::RenderWindow app(sf::VideoMode(680, 680, 32), "Titan");
    app.setFramerateLimit(60);
    Graphic_Manager lolilol;

    lolilol.loadTexture("mario.png");
    sf::Sprite sprite(lolilol.getTexture(("mario.png")));


    while (app.isOpen())
    {
        sf::Event event;

        while(app.pollEvent(event))
        {
            switch(event.type)
            {
                case sf::Event::Closed:
                    app.close();
                break;

                default:
                    break;
            }
        }

        // Remplissage de l'écran (couleur noire par défaut)
        app.clear();

        app.draw(sprite);

        // Affichage de la fenêtre à l'écran
        app.display();
    }
    return EXIT_SUCCESS;
}

Problème, au moment du rendu je n'ai qu'un carré de blanc de la taille de l'image, que je voulais charger. J'avais pensé à une texture détruite mais j'ai quand même quand même la bonne taille et je ne vois pas d'erreur dans le code de ma classe.
Voila une partie du code de ma classe graphic_manager.
#include "graphic_manager.hpp"

Graphic_Manager::Graphic_Manager() : m_texture(), m_map(NULL)
{}


/*
-----------------------------------------------------------
Gestion des ressources
-----------------------------------------------------------
*/

bool Graphic_Manager::loadTexture(std::string chemin, bool oblige)
{
    if(oblige == false)
    {
        std::map<std::string, sf::Texture>::iterator trouve = m_texture.find(chemin);
        if(trouve == m_texture.end())
        {
            sf::Texture texture;
            if(texture.loadFromFile(chemin))
            {
                m_texture[chemin] = texture;
                std::cout << "ok";
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }

    }
    else
    {
        sf::Texture texture;
        if(texture.loadFromFile(chemin))
        {
            m_texture[chemin] = texture;
            return true;
        }
        else
        {
            return false;
        }
    }


}


sf::Texture Graphic_Manager::getTexture(std::string chemin)
{
    std::map<std::string, sf::Texture>::iterator trouve = m_texture.find(chemin);
    if(trouve == m_texture.end())
    {
        std::cout << "pas ok";
        return sf::Texture();

    }
    else
    {
        std::cout << "ok"
        return m_texture[chemin];

    }

}

m_texture étant un attribut de ma classe std::map<std::string, sf::Texture> m_texture;
J'ai testé, j'ai bien "okok" dans la console, mes fonctions se terminent correctement je ne comprends pas... Et ce n'est pas l'image, si je la charge de manière "normale" dans le main, elle s'affiche.


Pouvez vous m'aider ?
Merci
Titre: Re: SFML 2, problème texture
Posté par: Laurent le Avril 03, 2012, 06:42:39 pm
getTexture devrait renvoyer une référence (sf::Texture&), ou un pointeur si tu ne veux pas avoir à jouer avec les exceptions (sf::Texture*). Là tu renvoies une nouvelle copie temporaire de la texture à chaque appel.
Titre: Re: SFML 2, problème texture
Posté par: Magic le Avril 04, 2012, 11:23:05 am
Ah oui, c'est vrai.
Mais Sprite, n’attend pas de pointeur...comment faire ?
Titre: Re: SFML 2, problème texture
Posté par: Laurent le Avril 04, 2012, 11:34:42 am
Ben tu déréférences.
sf::Texture* texture = lolilol.getTexture("mario.png");
if (texture)
    sprite.setTexture(*texture);
else
    erreur...
Titre: Re: SFML 2, problème texture
Posté par: Magic le Avril 04, 2012, 11:49:05 am
Merci beaucoup.
Mais par contre, j'y pense, si je supprime la texture...je vais avoir de gros problème avec mon pointeur...
Titre: Re: SFML 2, problème texture
Posté par: danman le Avril 04, 2012, 03:04:41 pm
Bien sur, si tu supprimes un truc et que tu l'utilises encore, ça crash, maintenant c'est à toi de gérer les allocations et les libérations au bon endroit et surtout au bon moment. C'est facile a faire, mais le problème est d'optimiser pour n'avoir que les ressources utiles.