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

Auteur Sujet: [Résolu] Gestionnaire de texture et sprite blanc  (Lu 1643 fois)

0 Membres et 1 Invité sur ce sujet

Raitosan

  • Full Member
  • ***
  • Messages: 221
    • Voir le profil
    • E-mail
[Résolu] Gestionnaire de texture et sprite blanc
« le: Avril 25, 2015, 10:32:25 am »
Salut à tous o/

Alors voici mon problème, j'ai fait un singleton pour gérer un gestionnaire de ressources, ici de texture, mais quand je récupère ma texture, mon sprite devient blanc...

Ce que je comprend pas, c'est que pourtant tout est bien stocker en mémoire, l'adresse renvoyée ne bouge pas, mais la texture est blanche... Pourtant ma texture n'est supprimée qu'à la fin du programme.

Voici mon singleton contenant le GraphicEngine qui contient les textures:
#ifndef RESSOURCESADMINISTRATOR_HPP
#define RESSOURCESADMINISTRATOR_HPP

#include <QApplication>
#include <QtWidgets>
#include <SFML/Graphics.hpp>
#include <iostream>
#include "includes/GraphicEngine.hpp"

class RessourcesAdministrator
{
    public:
        static RessourcesAdministrator* GetInstance();
        static void Kill();

        void SetGraphicEngine(GraphicEngine *graphicEngine);
        GraphicEngine* GetGraphicEngine() const;

    private:
        RessourcesAdministrator();
        ~RessourcesAdministrator();

        static RessourcesAdministrator *m_instance;
        GraphicEngine *m_graphicEngine;
};

#endif // RESSOURCESADMINISTRATOR_HPP

 
#include <sstream>
#include <string>
#include <iostream>
#include "includes/RessourcesAdministrator.hpp"

RessourcesAdministrator* RessourcesAdministrator::m_instance = RessourcesAdministrator::GetInstance();

RessourcesAdministrator::RessourcesAdministrator() : m_graphicEngine(new GraphicEngine())
{

}
RessourcesAdministrator::~RessourcesAdministrator()
{
    delete m_graphicEngine;
}
RessourcesAdministrator* RessourcesAdministrator::GetInstance()
{
    if (m_instance == nullptr)
      m_instance =  new RessourcesAdministrator;

    return m_instance;
}
void RessourcesAdministrator::Kill()
{
    if(m_instance != nullptr)
    {
      delete m_instance;
      m_instance = nullptr;
    }
}

void RessourcesAdministrator::SetGraphicEngine(GraphicEngine *graphicEngine)
{
    m_graphicEngine = graphicEngine;
}
GraphicEngine* RessourcesAdministrator::GetGraphicEngine() const
{
    return m_graphicEngine;
}
 

Voici maintenant la classe GraphicEngine:
#ifndef GRAPHICENGINE_HPP
#define GRAPHICENGINE_HPP

#include <iostream>
#include <SFML/Graphics.hpp>

class GraphicEngine
{
    public:
        GraphicEngine();
        ~GraphicEngine();

        bool LoadTilesetTexture(const std::string &path);
        sf::Texture* GetTilesetTexture(const unsigned int id); // On retourne la texture qui a pour id id

        void FreeTilesets(); // On libère la mémoire des textures Tileset
        void FreeAllTextures(); // On libère la mémoire de toutes les textures
    private:
        std::vector<sf::Texture*> m_tilesets; // Textures des tilesets
};

#endif // GRAPHICENGINE_HPP

 
#include "includes/GraphicEngine.hpp"
#include <QtWidgets>

using namespace std;

GraphicEngine::GraphicEngine()
{

}
GraphicEngine::~GraphicEngine()
{
    FreeAllTextures();
}

bool GraphicEngine::LoadTilesetTexture(const std::string &path)
{
    m_tilesets.push_back(new sf::Texture());
    cout << m_tilesets.size() << " / " << m_tilesets[0] << endl; // Teste pour connaitre l'adresse en mémoire de la texture
    if(m_tilesets.back()->loadFromFile(path))
        return true;
    else
    {
        delete m_tilesets.back();
        m_tilesets.pop_back(); // Le chargement de la texture a échouer, on supprime donc la dernière valeur du tableau que l'on vient de créer.
        return false;
    }
}
sf::Texture* GraphicEngine::GetTilesetTexture(const unsigned int id)
{
    cout << m_tilesets.size() << " / " << m_tilesets[0] << " / " << m_tilesets[id] << "(id)" << endl; // Teste pour connaitre l'adresse en mémoire de la texture

    if(id < m_tilesets.size())
        return m_tilesets[id];

    return nullptr;
}

/// ------------------------ ///
/// Libération de la mémoire ///
/// ------------------------ ///

void GraphicEngine::FreeTilesets()
{
    for(unsigned int i=0;i<m_tilesets.size();i++)
        if(m_tilesets[i] != nullptr)
            delete m_tilesets[i];
    m_tilesets.clear();
}
void GraphicEngine::FreeAllTextures()
{
    FreeTilesets();
}

/// ---------------------------------- ///
/// Fin de la libération de la mémoire ///
/// ---------------------------------- ///
 

Le retour des couts dans GraphicEngine renvoient bien:
1 / 0x15011840
1 / 0x15011840 / 0x15011840(id)

J'ai aussi fait un teste dans une classe qui récupère la texture pour l'affichée, et le GetTilesetTexture(0) renvois bien la bonne valeur...
Adresse memoire recuperer avec GetTilesetTexture(0): 0x15011840

Donc l'adresse en mémoire n'a pas l'air de bougée, ça signifie qu'on renvois bien la bonne texture..

Je fais comme ceci pour donner la texture à mon sprite:
mySprite.setTexture(*RessourcesAdministrator::GetInstance()->GetGraphicEngine()->GetTilesetTexture(0));

Quelqu'un a une idée? Car je sèche complètement pour le coup :/
Merci!
« Modifié: Avril 25, 2015, 12:01:52 pm par Raitosan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Gestionnaire de texture et sprite blanc
« Réponse #1 le: Avril 25, 2015, 01:14:53 pm »
Si c'est résolu, tu peux indiquer comment, et surtout éditer ton premier message pour ajouter un mot au début. Histoire que tout le monde ne parcourt pas ce gros post pour rien ;)
Laurent Gomila - SFML developer