Afficher les FPS sans charger de font

Lorsqu'on l'on crée un jeu, on aime bien afficher le nombre de FPS. Malheureusement, on n'a pas toujours envie de refiler un fichier font exprès pour ca, et on ne sait pas forcément si l'utilisateur a la font que l'on souhaite utiliser.

Voilà donc de quoi afficher les FPS sans sf::String !

#ifndef CFPS_HPP_INCLUDED
#define CFPS_HPP_INCLUDED
 
#include <sfml/Graphics.hpp>
 
#define EPAISSEUR 2
#define LARGEUR 4
#define HAUTEUR 10
#define ENTRE_LETTRE 10
 
#define DECALAGE_GAUCHE 5
#define DECALAGE_HAUT 10
 
#define HAUT_LETTRE DECALAGE_HAUT
#define MILIEU_LETTRE DECALAGE_HAUT + HAUTEUR / 2
#define BAS_LETTRE DECALAGE_HAUT + HAUTEUR
 
class cFPS
{
private:
    sf::Vector2<float> m_position;
    sf::Color m_color;
    sf::Clock m_clock;
    sf::Shape m_shape;
    int m_fps;
public:
    cFPS (sf::Vector2<float> position = sf::Vector2<float>(5.0f,5.0f), sf::Color color = sf::Color(255,255,255));
    void Draw(sf::RenderWindow& App);
    void cFPS::DrawNumber (sf::RenderWindow& App, int number, int offset);
};
 
cFPS::cFPS (sf::Vector2<float> position, sf::Color color)
{
    m_position = position;
    m_color = color;
    m_clock.Reset();
}
 
void cFPS::Draw (sf::RenderWindow& App)
{
    //On considère ici que les FPS sont situés entre 0 et 9999
    DrawNumber ( App, (m_fps/1000)%10, 0);
    DrawNumber ( App, (m_fps/100)%10, 1);
    DrawNumber ( App, (m_fps/10)%10, 2);
    DrawNumber ( App, (m_fps)%10, 3);
    m_fps = static_cast<int> (1.f / m_clock.GetElapsedTime());
    m_clock.Reset();
}
 
void cFPS::DrawNumber (sf::RenderWindow& App, int number, int offset)
{
    float GAUCHE_LETTRE = DECALAGE_GAUCHE + (offset * ENTRE_LETTRE);
    float DROITE_LETTRE = GAUCHE_LETTRE + LARGEUR;
 
    switch (number)
    {
        case 0:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, BAS_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 1:
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 2:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, MILIEU_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, MILIEU_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, BAS_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 3:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, BAS_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, MILIEU_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 4:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, MILIEU_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 5:
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, MILIEU_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, MILIEU_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, BAS_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 6:
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, BAS_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, BAS_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, MILIEU_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 7:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 8:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, MILIEU_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, BAS_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        case 9:
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, BAS_LETTRE, DROITE_LETTRE, BAS_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, BAS_LETTRE, DROITE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (DROITE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, HAUT_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, HAUT_LETTRE, GAUCHE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            App.Draw(sf::Shape::Line (GAUCHE_LETTRE, MILIEU_LETTRE, DROITE_LETTRE, MILIEU_LETTRE, EPAISSEUR, m_color, 0, m_color) );
            break;
        default:
            break;
    }
}
 
#endif // CFPS_HPP_INCLUDED

Eh oui, comme vous le voyez, on utilise de simples shapes openGL :)

Il suffit alors de créer une instance dans son programme et d'appeler Draw à chaque tour de boucle !

 
fr/tutoriels/fps.txt · Last modified: 2008/07/22 16:51 by Mindiell
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki