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!