3.10 Écrire du texte avec SDL_ttf

Il faut reconnaître que ça peut être utile, pour afficher un score par exemple (on ne va pas s'amuser a faire une image par caractère, quoique certain le font).

Pour cela nous utiliserons SDL_ttf dont voici l'include :

1
#include <SDL/SDL_ttf.h>

Pour utiliser cette librairie il faut la démarrée et l'arrêter (comme SDL) avec :

  • TTF_Init();
  • TTF_Quit();

Pour vérifier une éventuelle erreur d'initialisation vous pouvez faire :

1
2
3
4
if(TTF_Init() == -1){
	fprintf(stderr, "Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError());
	exit(EXIT_FAILURE);
}

Pour écrire il nous faut des fontes (.ttf) et deux fonctions pour ouvrir et fermer une fonte :

  • TTF_OpenFont
  • TTF_CloseFont

La déclaration est :

1
TTF_Font* police = NULL;

Pour trouver des fontes, deux solutions :

  • regarder dans /urs/share/fonts/
  • sur internet : Google font ou dafont.com

On ouvre une fonts avec :

1
TTF_Font *TTF_OpenFont(const char *file, int ptsize); 
  • file : nom du fichier .ttf à ouvrir
  • ptsize : taille de la police

Exemple :

1
2
TTF_Font* police = NULL;
police = TTF_OpenFont("times.ttf", 12);

On ouvre times.ttf avec une taille de 12 pixels.

Puis on ferme la police (avant TTF_Quit()) :

1
TTF_CloseFont(police);

Il y a trois manières d'écrire du texte :

  • Solid : très rapide, mais relativement moche.
  • Shaded : moins rapide, lettre plus lisses mais que sur font unit (pas de transparence).
  • Blended : lent, mais les lettres sont lisses et peuvent être mise sur un font transparent.

Pour écrire il faut générer une SDL_Surface* avec le texte :

1
2
3
SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg);
SDL_Surface *TTF_RenderText_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color fond);
SDL_Surface *TTF_RenderText_Blended(TTF_Font *font, const char *text, SDL_Color fg);

Exemple :

1
2
3
4
5
6
7
8
9
10
11
12
13
TTF_Init();
TTF_Font* font = NULL;
font = TTF_OpenFont("times.ttf", 12);

if(font != O){
	SDL_Color noir = {0, 0, 0}; //attention ce n'est pas un Uint32
	SDL_Surface* texte = TTF_RenderText_Blended(font, "coucou", 80) ;
	//affichage
	SDL_FreeSurface(texte); //On oublie toujours pas
	TTF_CloseFont(font);
}else{cout << "foirage à l'ouverture de times.ttf" << endl;}

TTF_Quit();

Bien sur il faut avoir les fontes dans son projet.

On peut aussi décorer le texte (mettre en gras, souligner...) avec :

  • font : la police que vous voulez décorer
  • style : le style de décoration.

Le style de décoration comprend plusieurs types :

  • TTF_STYLE_NORMAL : texte normal (par défaut)
  • TTF_STYLE_BOLD : gras
  • TTF_STYLE_ITALIC : italique
  • TTF_STYLE_UNDERLINE : souligné
  • TTF_STYLE_STRIKETHROUGH : j'en sais rien mais ça existe

Exemple :

1
2
3
4
5
6
/* Chargement de la police */
TTF_Font* police = TTF_OpenFont("times.ttf", 65);
/* Le texte sera écrit en italique et souligné */
TTF_SetFontStyle(police, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);
/* Écriture du texte en italique et souligné */
SDL_Surface* texte = TTF_RenderText_Blended(police, "Coucou .", couleurNoire);

Nous nous en servirons dans un exemple.