Bonjour,
j'ai créé une application utilisant SFML et je souhaitais l'améliorer en ajoutant un gestionnaire de polices qui gèrerait le chargement des polices en veillant à ce qu'une police ne soit chargée qu'une fois en mémoire.
Cependant j'ai du faire une erreur dans la gestion de la mémoire car après avoir chargé une police le programme plante dès que je sollicite le texte (Move, Draw...)
Je vous montre un code minimal qui ne fonctionne pas, si quelqu'un pouvait m'aider ce serait sympa
Je suis sûr que le problème est tout bête...
Voici FontManager.h :
#ifndef FONTMANAGER_H
#define FONTMANAGER_H
#include <iostream>
#include <SFML/Graphics.hpp>
#include <vector>
class FontManager
{
public:
// Constructeur
FontManager();
// Retourne la police correspondante
sf::Font getFont(const std::string &fontToLoad);
protected:
private:
std::vector<sf::Font> fonts; // Polices chargees
std::vector<std::string> fontsNames; // Noms des polices chargees
};
#endif // FONTMANAGER_H
FontManager.cpp :
#include "FontManager.h"
// Constructeur
FontManager::FontManager()
{
}
// Retourne la police correspondante
sf::Font FontManager::getFont(const std::string &fontToLoad)
{
/******** Declarations ********/
int nbFonts;
/******** Initialisation ********/
nbFonts = this->fonts.size();
/******** Traitement ********/
// Recherche de la police
for (int i(0); i < nbFonts; ++i)
{
if (this->fontsNames[i] == fontToLoad)
{
return this->fonts[i];
}
}
// Nouvelle police
this->fonts.push_back(sf::Font());
if (!this->fonts[nbFonts].LoadFromFile(fontToLoad))
{
std::cerr << "Chargement de la police echoue (" << fontToLoad << ")\n" << std::flush;
}
this->fontsNames.push_back(fontToLoad);
return this->fonts[nbFonts];
}
Et main.cpp :
#include "FontManager.h"
int main()
{
/******** Declarations ********/
sf::RenderWindow window;
FontManager fontManager;
sf::String text;
sf::Event Event;
/******** Initialisation ********/
window.Create(sf::VideoMode::GetMode(0), "Test");
text.SetFont(fontManager.getFont("res/fonts/akoom.ttf")); // FAIT PLANTER LE PROGRAMME
text.SetText("test");
text.SetColor(sf::Color(200, 200, 200));
/******** Traitement ********/
window.Draw(text); // FAIT PLANTER LE PROGRAMME
window.Display();
while (window.IsOpened())
{
while (window.GetEvent(Event))
{
if (Event.Type == sf::Event::Closed)
window.Close();
}
}
return 0;
}
Ce programme fonctionne lorsque je commente la ligne
text.SetFont(fontManager.getFont("res/fonts/akoom.ttf"));
ou lorsque je charge la police directement dans le main sans passer par le gestionnaire (bien entendu la police "res/fonts/akoom.ttf" existe.