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

Auteur Sujet: Problème de gestion de polices  (Lu 2168 fois)

0 Membres et 1 Invité sur ce sujet

Alkanor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Problème de gestion de polices
« le: Février 16, 2013, 11:41:57 am »
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.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de gestion de polices
« Réponse #1 le: Février 16, 2013, 12:53:34 pm »
Ta fonction getFont renvoie à chaque fois une copie temporaire (détruite immédiatement après l'appel) de la police que ton manager stocke. Il faut renvoyer une référence (sf::Font&).
Laurent Gomila - SFML developer

Alkanor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Problème de gestion de polices
« Réponse #2 le: Février 16, 2013, 02:56:48 pm »
Merci beaucoup c'était effectivement la solution.

Mais comment faire pour que mon instance de FontManager soit accessible dans toutes les classes de mon projet (admettons qu'il y ai 5 classes qui aient besoin de charger des fonts) sans le passer en paramètre à chaque fois ? Ça marcherait si je définis mes vector en static dans les attributs de FontManager et que j'instancie la classe dans chaque fonction qui en aurait besoin ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème de gestion de polices
« Réponse #3 le: Février 16, 2013, 05:40:34 pm »
Il suffit de définir un accesseur global à ton instance de FontManager.

font = getFontManager().getFont(...);

// ou bien, style singleton :

font = FontManager::getInstance().getFont(...);
Laurent Gomila - SFML developer

Alkanor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Problème de gestion de polices
« Réponse #4 le: Février 17, 2013, 06:56:03 pm »
Merci, j'aime l'idée du singleton, je vais étudier ça de plus près =)

Et bravo pour cette superbe bibliothèque qu'est la SFML, Monsieur Gomila !