Utiliser SDL TTF

Un article de Cyber Igor.

Sommaire

[modifier] Intro

L'affichage de texte avec la SDL peut se faire de manière assez simple en utilisant une image contenant tous les caractères, et en découpant certaines parties pour afficher les bons sur la surface cible. Mais cela impose une taille égale pour toutes les lettres, ce qui n'est pas forcément pratique. De plus, vous devez utiliser des fonts au format image (des fonts bitmaps), alors que les fonts TTF sont bien plus répandues.

L'utilisation du format TTF est par contre assez difficile à utiliser. Mais heureusement pour vous, il existe une lib qui peut faire ce travaile pour vous : SDL_ttf.

[modifier] Installation

Pour installer SDL_ttf, il faut télécharger et installer le pack SDL_ttf si vous utilisez Dev-c++, sinon il y a tout ce qu'il faut ici

Il faut ensuite ajouter -lSDL_ttf dans l'éditeur de liens de votre projet et mettre l'en-tête dans votre fichier source :

#include <SDL/SDL_TTF.h>

[modifier] Compilation sous GNU/LINUX

Après installation de la SDL et SDL_ttf par votre gestionnaire de paquet, les librairies de développement et les binaires SDL (exemple: libsdl1.2,libsdl1.2-dev et libsdl-ttf1.2,libsdl-ttf1.2-dev). Voici la commande à taper pour produire le programme exécutable. Sur votre terminal placer vous sur le dossier du code source édité en C puis taper:

$ gcc -o mon_executable mon_fichier_source.c `sdl-config --libs` -lSDL_ttf

Ensuite, il ne vous reste plus qu'à lancer le programme si il n'y a pas d'erreurs:

$./mon_executable

[modifier] Utilisation

SDL_ttf est assez simple d'utilisation. J'ai créé ici une classe pour se simplifier encore la vie et afficher du texte très facilement :

[modifier] SDLFont.h

#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <string>
 
class SDLFont {
 
public:
    // Constructeur et destructeur
    SDLFont(const char* FontName,int size);
    ~SDLFont();
 
    // Affichage en utilisant la font
    void Text(int x,int y,int r,int g,int b,SDL_Surface* surf,
              const char* format,...);
 
    // Donne la longueur d'un texte
    int Length(const char* format,...);
 
    // Donne la hauteur d'un texte
    int Height(const char* format,...);
 
private:
    // Pointeur sur la font
    TTF_Font* font;
 
    // Nom de la font TTF
    std::string FontName;
 
};

[modifier] SDLFont.cpp

#include "SDLFont.h"
#include <cstdarg>
 
// Constructeur : prend pour arguments :
//   - le chemin et le nom de la font .ttf avec une string ->FontName
//   - la taille de la font générée avec un int ->size
//   - la couleur de la font générée avec un SDL_Color -> color
SDLFont::SDLFont(const char* FontName,int size)
{
    FontName = FontName;
 
    // On ouvre la font
    font=TTF_OpenFont(FontName,size);
    if(!font)
    {
        printf("TTF_OpenFont: %s\n", TTF_GetError());
        exit(1);
    }
}
 
// Destructeur
SDLFont::~SDLFont()
{
    TTF_CloseFont(font);
}
 
// Affiche du texte
void SDLFont::Text(int x,int y,int r,int g,int b,SDL_Surface* surf,
                   const char* format,...)
{
    va_list liste;
    va_start(liste,format);
 
    SDL_Rect rect = {x,y};
 
    char texte[512];
    vsprintf(texte,format,liste);
 
    SDL_Surface* text_surface;
 
    SDL_Color color = {r,g,b};
 
    if(!(text_surface = TTF_RenderText_Blended(font,texte,color)))
        printf("%s\n", TTF_GetError());
 
    else
    {
        SDL_BlitSurface(text_surface,NULL,surf,&rect);
        SDL_FreeSurface(text_surface);
    }
}
 
// Fonction qui renvoit la longueur du texte affiché avec la font
int SDLFont::Length(const char* format,...)
{
    va_list liste;
    va_start(liste,format);
 
    int w,h;
 
    char texte[512];
    vsprintf(texte,format,liste);
 
    if (TTF_SizeText(font,texte,&w,&h) == 0)
        return w;
    else
        return -1;
}
 
// Fonction qui renvoit la hauteur du texte affiché avec la font
int SDLFont::Height(const char* format,...)
{
    va_list liste;
    va_start(liste,format);
 
    int w,h;
 
    char texte[512];
    vsprintf(texte,format,liste);
 
    if (TTF_SizeText(font,texte,&w,&h) == 0)
        return h;
    else
        return -1;
}

[modifier] Fin

Et voila!

Un petit exemple d'utilisation :

#include "SDLFont.h"
 
int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();
 
    SDL_Surface* ecran = SDL_SetVideoMode(800,600,32,SDL_HWSURFACE);
 
    SDLFont fonte("arial.ttf",14);
 
    fonte.Text(100,100,255,0,0,ecran,"Ceci est un %s !","test");
 
    SDL_Flip(ecran);
 
    SDL_Delay(2000);
 
    TTF_Quit();
    SDL_Quit();
 
    return 0;
}


Bonne utilisation!

[page de dscussion]Discuter:Utiliser SDL TTF

J'ai rien capté au paragraphe Intro. La classe que tu utilises pourrait utiliser vsprintf(), ce qui la rendrait encore plus pratique. J'édite si personne d'autre ne veut le faire. --Remram44 22 fév 2006 à 16:36 (CET)

Modifications terminées, voici une bonne classe prête à l'utilisation :) --Remram44 1 avril 2006 à 14:22



Les commentaires ci-dessus ont été laissés par des visiteurs.
Le gestionnaire du site n’est pas responsable de leur contenu. This site's operators can not take responsibility for the content of such comments.