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

Auteur Sujet: SFML 2, problème texture  (Lu 5463 fois)

0 Membres et 1 Invité sur ce sujet

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
SFML 2, problème texture
« 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

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: SFML 2, problème texture
« Réponse #1 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.
Laurent Gomila - SFML developer

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re: SFML 2, problème texture
« Réponse #2 le: Avril 04, 2012, 11:23:05 am »
Ah oui, c'est vrai.
Mais Sprite, n’attend pas de pointeur...comment faire ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: SFML 2, problème texture
« Réponse #3 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...
Laurent Gomila - SFML developer

Magic

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re: SFML 2, problème texture
« Réponse #4 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...
« Modifié: Avril 04, 2012, 01:06:49 pm par Magic »

danman

  • Hero Member
  • *****
  • Messages: 1121
    • Voir le profil
    • E-mail
Re: SFML 2, problème texture
« Réponse #5 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.
Pointilleur professionnel