Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Programmation > Lecture du tutoriel

Ecrire du texte avec SDL_ttf

Avatar
Auteur : M@teo21
Créé : le 20/05/2006 22:12:06
Modifié : le 20/05/2006 22:20:33
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Je suis persuadé que la plupart d'entre vous se sont déjà posés cette question : "Mais bon sang il n'y a aucune fonction pour écrire du texte dans une fenêtre SDL ?"

Il est temps de vous apporter la réponse : c'est non :D
Bien sûr, si c'était vraiment "non" le chapitre s'arrêterait là et j'aurais écrit le plus court chapitre de l'histoire du Site du Zér0 :p
Alors qu'en est-il ?

En fait, la SDL ne propose vraiment aucune fonction pour écrire du texte dans la fenêtre, je ne vous ai pas menti.
Mais il y a quand même toujours moyen d'y arriver, il suffit d'utiliser... la ruse ! Et pour cela vous avez 2 solutions :



Nous allons donc dans ce chapitre apprendre à manier SDL_ttf pour pouvoir écrire du texte dans la fenêtre :)
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

Installer SDL_ttf

Il faut savoir que, comme SDL_image, SDL_ttf est une librairie qui nécessite que la SDL soit installée.
Bon, si à ce stade du cours vous n'avez toujours pas installé la SDL c'est grave, donc je vais supposer que ça c'est fait ;)

Tout comme SDL_image, SDL_ttf est une des librairies liées à la SDL les plus populaires (c'est-à-dire qu'elle est très téléchargée). Comme vous allez pouvoir le constater, cette librairie est effectivement bien faite. Une fois que vous aurez appris à l'utiliser, vous ne pourrez plus vous en passer !


Comment fonctionne SDL_ttf ?



SDL_ttf n'utilise pas des images bitmap pour générer du texte dans des SDL_Surface. C'est une méthode en effet assez lourde à mettre en place et on n'aurait pu utiliser qu'une seule police.
En fait, SDL_ttf fait appel à une autre librairie : Freetype. C'est une librairie capable de lire les fichiers de police (.ttf) et d'en sortir l'image. SDL_ttf récupère donc cette "image" et la convertit pour la SDL en créant une SDL_Surface.

Point important : SDL_ttf a donc besoin de la librairie Freetype pour fonctionner, sinon elle ne sera pas capable de lire les fichiers .ttf.



Installer SDL_ttf



Rendez-vous sur la page de téléchargement de SDL_ttf.
Là, choisissez le fichier qu'il vous faut dans la section "Binary".

Sous Windows, vous remarquerez qu'il n'y a que deux fichiers zip ayant le suffixe "win32" et "VC6".
Le premier (win32) contient la DLL que vous aurez besoin de livrer avec votre exécutable. Vous aurez aussi besoin de mettre cette DLL dans le dossier de votre projet pour pouvoir tester votre programme évidemment :p
Le second (VC6) contient les .h et .lib dont vous allez avoir besoin pour programmer. On pourrait penser d'après le nom que ça n'est fait que pour Visual-C++. C'est vrai. Mais en fait, rassurez-vous, exceptionnellement le fichier .lib livré ici marche aussi avec mingw32, donc il fonctionnera sous Code::Blocks et Dev-C++.


Le fichier ZIP contient comme d'habitude un dossier include et un dossier lib. Mettez le contenu du dossier include dans mingw32/include/SDL et le contenu du dossier lib dans mingw32/lib (c'est un fichier .lib et non un .a, mais comme je vous ai dit exceptionnellement ce fichier marche avec le compilateur mingw).

Vous devez copier le fichier SDL_ttf.h dans le dossier mingw32/include/SDL et non pas dans mingw32/include tout court.
Attention aux erreurs !



Configurer un projet pour SDL_ttf



Eh bien c'est long hein !
Il nous reste une dernière petite chose à faire : configurer notre projet pour qu'il utilise bien SDL_ttf. Il va falloir modifier les options du linker pour qu'il compile bien votre programme en utilisant la librairie SDL_ttf.

Vous avez déjà appris à faire cette opération pour la SDL et pour SDL_image, je vais donc aller plus vite.
Comme je travaille sous Code::Blocks, je vais vous donner la procédure avec cet IDE. Ce n'est pas bien différent avec les autres IDE :


Mais... On n'a pas besoin de linker avec la librairie Freetype ?


Non, car comme je vous l'ai dit Freetype est incluse dans la DLL de SDL_ttf. Vous n'avez pas à vous préoccuper de Freetype, c'est SDL_ttf qui gère ça maintenant :)

La documentation



Maintenant que vous commencez à devenir des programmeurs aguerris, vous devriez vous demander immédiatement : "Mais où est la doc ?"
Si vous ne vous êtes pas encore posé cette question, c'est que vous n'êtes pas encore un programmeur aguerri :p

Bien sûr, vous vous dites : "Il y a toujours les tutos de tonton M@teo pour apprendre à s'en servir". C'est vrai : je vais vous apprendre à vous en servir dans ce chapitre. Toutefois :



En clair : une doc c'est complet mais un peu dur à comprendre quand on n'a pas l'habitude, un tuto c'est pas complet mais ça aide bien à démarrer, surtout quand on débute ;)

Je vous conseille donc de mettre dans vos favoris l'adresse suivante :



C'est l'adresse de la doc de SDL_ttf. Elle est disponible en plusieurs formats : HTML en ligne, HTML zippé, PDF etc.
Prenez la version qui vous arrange le plus :)

Vous verrez que SDL_ttf est une librairie très simple : il y a peu de fonctions.
Environ 40-50 fonctions, c'est peu (je vous dis pas combien il y en a dans la SDL ou dans des librairies plus complexes que nous étudierons plus tard comme Qt !). Bref, ça devrait être signe (pour le programmeur aguerri que vous êtes :p ) que cette librairie est simple et que vous saurez la manier assez vite.



Allez, il est temps d'apprendre à utiliser SDL_ttf maintenant :)

Chargement de SDL_ttf

L'include



Avant toute chose, il faut ajouter l'include suivant en haut de votre fichier .c :

Code : C
1
#include <SDL/SDL_ttf.h>


Si vous avez des erreurs de compilation à ce stade, vérifiez si vous avez bien placé le fichier SDL_ttf.h dans le dossier mingw32/include/SDL et non dans mingw32/include tout court.


Démarrage de SDL_ttf



Tout comme la SDL, SDL_ttf a besoin d'être démarrée et arrêtée.
Il y a donc des fonctions très similaires à la SDL :



Il n'est pas nécessaire que la SDL soit démarrée avant SDL_ttf.


Pour démarrer SDL_ttf (on dit aussi "initialiser"), on doit donc appeler la fonction TTF_Init().
Aucun paramètre n'est nécessaire. La fonction renvoie -1 s'il y a eu une erreur.

Vous pouvez donc démarrer SDL_ttf très simplement comme ceci :

Code : C
1
TTF_Init();


(dur de faire plus simple avouez :p )

Si vous voulez vérifier s'il y a une erreur et être ainsi plus rigoureux, utilisez ce code à la place :

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


S'il y a eu une erreur au démarrage de SDL_ttf, un fichier stderr.txt sera créé (sous Windows du moins) contenant un message explicatif de l'erreur.
Pour ceux qui se poseraient la question : la fonction TTF_GetError() renvoie le dernier message d'erreur de SDL_ttf. C'est pour cela qu'on l'utilise dans le fprintf.


Arrêt de SDL_ttf



Pour arrêter SDL_ttf, on appelle TTF_Quit(). Là encore, pas de paramètre, pas de prise de tête ;)
Vous pouvez appeler TTF_Quit avant ou après SDL_Quit, peu importe.

Code source (attention c'est du haut niveau !) :

Code : C
1
TTF_Quit();


Ca va vous suivez toujours ? :p



Chargement d'une police



Bon tout ça c'est bien beau mais c'est pas assez compliqué, c'est pas rigolo.
Passons aux choses sérieuses si vous le voulez bien ! :)

Maintenant que SDL_ttf est chargée, nous devons charger une police.
Une fois que cela sera fait, nous pourrons enfin voir comment écrire du texte !

Là encore il y a 2 fonctions :



TTF_OpenFont doit stocker son résultat dans une variable de type TTF_Font. Vous devez créer un pointeur de TTF_Font, comme ceci :

Code : C
1
TTF_Font *police = NULL;


Le pointeur police contiendra donc les informations sur la police une fois qu'on l'aura ouverte.

La fonction TTF_OpenFont prend 2 paramètres :



Où trouver des polices .ttf ?


Sur votre ordinateur



Vous en avez déjà sur votre ordinateur !
Si vous êtes sous Windows, vous en trouverez déjà plein dans le dossier C:/Windows/Fonts
Vous n'avez qu'à copier le fichier de police qui vous plaît dans le dossier de votre projet.

Attention : si le nom contient des caractères "bizarres" comme des espaces, des accents ou même des majuscules, je vous conseille de le renommer. Pour être sûr de n'avoir aucun problème, n'utilisez que des minuscules.
Exemple de nom incorrect : TIMES NEW ROMAN.TTF
Exemple de nom correct : times.ttf


Sur Internet



Autre possibilité : récupérer une police sur Internet. Vous trouverez pas mal de sites proposant des polices gratuites et originales à télécharger.
Testez un coup de Google "polices", vous allez voir le résultat. Il y a de quoi faire !

Je connais de nombreux bons sites, et si personnellement je devais n'en retenir qu'un ce serait dafont.com. C'est bien classé, très bien fourni et varié. Que demande le peuple :D

Voici un aperçu de polices que vous pourrez trouver très facilement là-bas :

Image utilisateur

Image utilisateur

Image utilisateur


C'est que du bonheur :D


Bon, retour à la programmation



Allez, on va utiliser la police Angelina elle me plaît bien ^^

On ouvre la police comme ceci :

Code : C
1
police = TTF_OpenFont("angelina.ttf", 65);


La police utilisée sera angelina.ttf. J'ai bien pris soin de mettre le fichier dans le dossier de mon projet et de le renommer pour qu'il soit tout en minuscules.
La police sera de taille 65. Ca paraît gros mais visiblement c'est une police qu'il faut écrire en gros pour qu'on puisse la voir ^^

Ce qui est très important, c'est que TTF_OpenFont stocke le résultat dans la variable police. Vous allez réutiliser cette variable tout à l'heure en écrivant du texte. Elle permettra d'indiquer la police que vous voulez utiliser pour écrire du texte.

Vous pouvez ouvrir plusieurs polices à la fois.
Vous n'avez pas besoin d'ouvrir une même police à chaque fois que vous écrivez du texte : ouvrez la police juste une fois au début du programme et fermez-la à la fin.


Fermer la police



Il faut penser à fermer chaque police ouverte avant l'appel à TTF_Quit().
Dans mon cas, ça donnera donc le code suivant :

Code : C
1
2
TTF_CloseFont(police); /* Doit être avant TTF_Quit() */
TTF_Quit();


Et voilà l'travail :)


Code source pour résumer



On résume tout ce qu'on vient d'apprendre sur le "chargement" de SDL_ttf à l'aide d'un petit code source complet histoire de se situer. Les lignes intéressantes sont commentées :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h> /* Ne pas oublier l'include ! */

int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL;
    SDL_Event event;
    TTF_Font *police = NULL; /* Stockera les informations de police */
    int continuer = 1;



    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init(); /* Initialisation (peut être avant ou après SDL_Init) */

    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);

    police = TTF_OpenFont("angelina.ttf", 65); /* Ouverture de la police au début */


    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
        }

        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        SDL_Flip(ecran);
    }

    TTF_CloseFont(police); /* Fermeture de la police avant TTF_Quit */
    TTF_Quit(); /* Arrêt de SDL_ttf (peut être avant ou après SDL_Quit, peu importe) */

    SDL_Quit();


    return EXIT_SUCCESS;
}

Les différentes méthodes d'écriture

Maintenant que SDL_ttf est chargée et qu'on a une variable police chargée elle aussi, plus rien ni personne ne nous empêchera d'écrire du texte dans notre fenêtre SDL ! :pirate:

Bon, écrire du texte c'est bien, mais avec quelle fonction ?
J'ai été un peu surpris la première fois que j'ai vu la doc de SDL_ttf : 12 fonctions pour écrire du texte, ça en fait du choix !

En fait, il y a 3 façons différentes pour SDL_ttf de dessiner du texte :



J'ai mis un peu de temps à m'habituer à ces 3 types d'écriture du texte.
Pour vous aider à vous faire une idée, voici des screenshots d'un même texte écrit avec ces différentes techniques :

Image utilisateur
Solid
Mode d'écriture très rapide mais pas très beau (texte non lissé).



Image utilisateur
Shaded
Mode d'écriture lent mais plus joli car antialisé. Fond obligatoirement uni.



Image utilisateur
Blended
Mode d'écriture lent (et blit lent) mais très beau car antialisé et fonctionne sur un fond non uni.


En résumé :



Voilà, vous devriez déjà être un peu plus familier avec ces 3 types d'écriture de SDL_ttf.

Je vous avais dit qu'il y avait 12 fonctions en tout.
En effet, pour chacun de ces 3 types d'écriture, il y a 4 fonctions. Chaque fonction écrit le texte à l'aide d'un charset différent, c'est-à-dire d'une palette de caractères différentes. Il y en a 4 :



L'idéal est d'utiliser l'Unicode car c'est un charset gérant la quasi-totalité des caractères existant sur Terre (eh ouais ça en fait avec toutes les langues ^^ ).
Toutefois, utiliser l'Unicode n'est pas toujours forcément simple (un caractère prend plus que la taille d'un char en mémoire), nous ne verrons pas comment l'utiliser ici.

A priori, si votre programme est écrit en français le mode Latin1 suffit amplement, vous pouvez vous contenter de celui-là :)


Les 3 fonctions utilisant le charset Latin1 sont :



Vous savez tout, ou presque :)
Nous allons voir comment écrire un texte en Blended (c'est le plus joli ^^ )


Exemple d'écriture de texte en Blended



Pour spécifier une couleur à SDL_ttf, on ne va pas utiliser le même type qu'avec la SDL (un Uint32 créé à l'aide de la fonction SDL_MapRGB).
Au contraire, nous allons utiliser une structure toute prête de la SDL : SDL_Color. Cette structure comporte 3 sous-variables : la quantité de rouge, de vert et de bleu.

Si vous voulez créer une variable couleurNoire, vous devrez donc écrire :

Code : C
1
SDL_Color couleurNoire = {0, 0, 0};


Attention à ne pas confondre avec les couleurs qu'utilise habituellement la SDL !
La SDL utilise des Uint32 créés à l'aide de SDL_MapRGB.
SDL_ttf utilise des SDL_Color.


On va écrire un texte en noir dans une SDL_Surface texte :

Code : C
1
texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);


Vous voyez dans l'ordre les paramètres à envoyer : la police (de type TTF_Font), le texte à écrire, et enfin la couleur (de type SDL_Color).
Le résultat est stocké dans une SDL_Surface. SDL_ttf calcule automatiquement la taille nécessaire à donner à la surface en fonction de la taille du texte et du nombre de caractères que vous avez voulu écrire.

Comme toute SDL_Surface, notre pointeur texte contient les sous-variables w et h indiquant respectivement sa largeur et sa hauteur.
C'est donc un bon moyen de connaître les dimensions du texte une fois que celui-ci a été écrit dans la SDL_Surface. Vous n'aurez qu'à faire :
Code : C
1
2
texte->w /* Donne la largeur */
texte->h /* Donne la hauteur */



Code complet d'écriture de texte



Voilà vous savez tout :)
Voici un code complet montrant l'écriture de texte en mode Blended :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>

int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL, *texte = NULL, *fond = NULL;
    SDL_Rect position;
    SDL_Event event;
    TTF_Font *police = NULL;
    SDL_Color couleurNoire = {0, 0, 0};
    int continuer = 1;


    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();

    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);

    fond = IMG_Load("moraira.jpg");

    /* Chargement de la police */
    police = TTF_OpenFont("angelina.ttf", 65);
    /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
    texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);

    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
        }

        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

        position.x = 0;
        position.y = 0;
        SDL_BlitSurface(fond, NULL, ecran, &position); /* Blit du fond */

        position.x = 60;
        position.y = 370;
        SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte par-dessus */
        SDL_Flip(ecran);
    }

    TTF_CloseFont(police);
    TTF_Quit();

    SDL_FreeSurface(texte);
    SDL_Quit();


    return EXIT_SUCCESS;
}


Et le résultat :

Image utilisateur


Sympa n'est-ce pas ? :)

Si vous voulez changer de mode d'écriture pour tester, il n'y a qu'une ligne à changer : celle créant la surface (avec l'appel à la fonction TTF_RenderText_Blended).

La fonction TTF_RenderText_Shaded prend un 4ème paramètre contrairement aux 2 autres. Ce dernier paramètre est la couleur de fond à utiliser. Vous devrez donc créer une autre variable de type SDL_Color pour indiquer une couleur de fond (par exemple le blanc).




Attributs d'écriture du texte



Il est possible aussi de spécifier des attributs d'écriture, comme gras, italique et souligné.

Il faut d'abord que la police soit chargée. Vous devriez donc avoir une variable police valide.
Vous pouvez alors faire appel à la fonction TTF_SetFontStyle qui va modifier la police pour qu'elle soit en gras, italique ou souligné selon vos désirs.

La fonction prend 2 paramètres :



Pour les flags, vous devez utiliser ces constantes :


Comme c'est une liste de flags, vous pouvez les combiner à l'aide du symbole | comme on a appris à le faire.

Testons :

Code : C
1
2
3
4
5
6
/* Chargement de la police */
police = TTF_OpenFont("angelina.ttf", 65);
/* Le texte sera écrit en italique et souligné */
TTF_SetFontStyle(police, TTF_STYLE_ITALIC | TTF_STYLE_UNDERLINE);
/* Ecriture du texte en italique et souligné */
texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);


Résultat, le texte est écrit en italique et souligné :

Image utilisateur


Pour restaurer une police à son état normal, il suffit de refaire appel à TTF_SetFontStyle en utilisant cette fois le flag TTF_STYLE_NORMAL.



Exercice : le compteur



Cet exercice va cumuler ce que vous avez appris dans ce chapitre et dans le chapitre sur la gestion du temps.
Votre mission, si vous l'acceptez, consistera à créer un compteur qui s'incrémentera tous les dixièmes de seconde.

Ce compteur va donc progressivement afficher :
0
100
200
300
400
etc.

Au bout d'une seconde je veux voir affiché 1000, au bout d'une seconde et demie je veux voir affiché 1500 etc.

Astuce pour écrire dans une chaîne



Pour réaliser cet exercice, vous aurez besoin de savoir comment écrire dans une chaîne de caractères en mémoire.
En effet, vous devez donner un char* à TTF_RenderText mais vous ce que vous aurez c'est un nombre (un int par exemple). Comment convertir un nombre en chaîne de caractères ?

On peut utiliser la fonction sprintf.
Elle marche de la même manière que fprintf, sauf qu'au lieu d'écrire dans un fichier elle écrit dans une chaîne (le "s" de sprintf signifie "string", c'est-à-dire "chaîne" en anglais).
Le premier paramètre que vous lui donnerez sera donc un pointeur sur un tableau de char.

Veillez à réserver suffisamment d'espace pour le tableau de char si vous ne voulez pas déborder en mémoire !


Exemple :

Code : C
1
sprintf(temps, "Temps : %d", compteur);


Ici, temps est un tableau de char (20 caractères), et compteur est un int qui contient le temps.
Après cette instruction, la chaîne temps contiendra par exemple "Temps : 500"

Allez au boulot ! ;)


Correction



Voici une correction possible de l'exercice :

Code : C
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
int main(int argc, char *argv[])
{
    SDL_Surface *ecran = NULL, *texte = NULL;
    SDL_Rect position;
    SDL_Event event;
    TTF_Font *police = NULL;
    SDL_Color couleurNoire = {0, 0, 0}, couleurBlanche = {255, 255, 255};
    int continuer = 1;
    int tempsActuel = 0, tempsPrecedent = 0, compteur = 0;
    char temps[20] = ""; /* Tableau de char suffisamment grand */


    SDL_Init(SDL_INIT_VIDEO);
    TTF_Init();

    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    SDL_WM_SetCaption("Gestion du texte avec SDL_ttf", NULL);


    /* Chargement de la police */
    police = TTF_OpenFont("angelina.ttf", 65);

    /* Initialisation du temps et du texte */
    tempsActuel = SDL_GetTicks();
    sprintf(temps, "Temps : %d", compteur);
    texte = TTF_RenderText_Shaded(police, temps, couleurNoire, couleurBlanche);

    while (continuer)
    {
        SDL_PollEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
        }

        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));


        tempsActuel = SDL_GetTicks();
        if (tempsActuel - tempsPrecedent >= 100) /* Si 100ms au moins se sont écoulées */
        {
            compteur += 100; /* On rajoute 100ms au compteur */
            sprintf(temps, "Temps : %d", compteur); /* On écrit dans la chaîne "temps" le nouveau temps */
            SDL_FreeSurface(texte); /* On supprime la surface précédente de la mémoire avant d'en charger une nouvelle (IMPORTANT) */
            texte = TTF_RenderText_Shaded(police, temps, couleurNoire, couleurBlanche); /* On écrit la chaine temps dans la SDL_Surface */
            tempsPrecedent = tempsActuel; /* On met à jour le tempsPrecedent */
        }

        position.x = 180;
        position.y = 210;
        SDL_BlitSurface(texte, NULL, ecran, &position); /* Blit du texte contenant le temps */
        SDL_Flip(ecran);

    }

    TTF_CloseFont(police);
    TTF_Quit();

    SDL_FreeSurface(texte);
    SDL_Quit();


    return EXIT_SUCCESS;
}


Voici ce que ça donne au bout de 13,9 secondes très exactement :p

Image utilisateur




Ce n'est pas parfait, on pourrait par exemple utiliser SDL_Delay pour éviter d'utiliser 100% du CPU.


Pour aller plus loin



Si vous voulez améliorer ce petit bout de programme, vous pouvez essayer d'en faire un jeu où il faut cliquer le plus de fois possible dans la fenêtre avec la souris dans un temps imparti. Un compteur s'incrémentera à chaque clic de la souris.
Un compte à rebours doit s'afficher. Lorsqu'il atteint 0, on récapitule le nombre de clics effectués et on demande si on veut faire une nouvelle partie.

Vous pouvez aussi gérer les meilleurs scores en les enregistrant dans un fichier. Ca vous fera travailler à nouveau la gestion des fichiers en C ;)

Bon courage ! :)

Q.C.M.

De quel librairie se sert SDL_ttf pour fonctionner ?
Dans quelle ordre les fonctions doivent être appelées ?
Lequel de ces modes d'écriture ne gère pas la transparence ?
Quel est le type de variable retourné par TTF_RenderText_Blended ?


Vous savez maintenant tout ce qu'il faut pour écrire du texte dans une fenêtre SDL :)

Mine de rien, vous commencez à en savoir beaucoup sur la SDL. Nous aurons bientôt fini d'en faire le tour.
Nous devons toutefois apprendre à gérer le son (nos programmes sont muets pour le moment) et faire encore quelques TP pour bien comprendre comment on s'y prend pour créer des jeux en C.

Lorsque nous en aurons fini avec la SDL, nous passerons au C++. En effet, nous n'avons fait que du C jusqu'ici, et nous ne connaissons toujours rien du langage C++ ! Nous y viendrons donc dans quelques chapitres, lorsque la partie III sur la SDL sera terminée.
Chapitre précédent Sommaire Chapitre suivant
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 375 Zéros connectés | Requêtes SQL 11 requêtes | Temps de génération de la page : Total (SQL) 0.2145s (0.1981s)