IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Conseils pour utiliser TTF_RenderText_Blended


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 59
    Par défaut Conseils pour utiliser TTF_RenderText_Blended
    Bonjour,
    je vous écris ce message pour vous demander conseil.
    Mon code ci dessous fonctionne parfaitement mais je voulais savoir s'il existait des "améliorations" dans les fonctions. J'ai cherché sur internet sans trouver mon bonheur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    #include ...
     
    #define EcranLarg 800
    #define EcranHaut 600
     
    #define couleurTexteVert (SDL_Color){0,255,0,0}
    #define couleurTexteRouge (SDL_Color){250,0,0,0}
     
    void initSDL(SDL_Surface **ecran)
    {    ...   }
     
    void  EcrireTexte(SDL_Surface *ecran, TTF_Font *police,char *mot, int positionY)
    {
        SDL_Surface *texte=TTF_RenderText_Blended(police, mot, couleurTexteVert);
     
        SDL_Rect positionTexte= {100, positionY, 0, 0};//centrage du mot dans la zone de bouton
     
        SDL_BlitSurface(texte, NULL, ecran, &positionTexte);
     
        SDL_Flip(ecran);
        SDL_FreeSurface(texte);
    }
     
    void  EcrireTexteRacourci(SDL_Surface *ecran, TTF_Font *police,char *mot, int positionY)
    {
        SDL_Rect positionTexte= {100, positionY, 0, 0};//centrage du mot dans la zone de bouton
     
        SDL_BlitSurface(TTF_RenderText_Blended(police, mot, couleurTexteVert), NULL, ecran, &positionTexte);
     
        SDL_Flip(ecran);
    }
     
    void  EcrireTexteDecompose(SDL_Surface *ecran, TTF_Font *police,char *motDebut,char *motFin, int positionY)
    {
        SDL_Surface *texteDebut=TTF_RenderText_Blended(police, motDebut, couleurTexteVert);
        SDL_Surface *texteFin=TTF_RenderText_Blended(police, motFin, couleurTexteRouge);
        SDL_Rect positionTexteDebut= {400, positionY, 0, 0};//centrage du mot dans la zone de bouton
        SDL_Rect positionTexteFin= {400, positionY, 0, 0};//centrage du mot dans la zone de bouton
     
        if(strcmp(motDebut,"")==0)
            positionTexteFin.x= positionTexteDebut.x;
        else
            positionTexteFin.x= positionTexteDebut.x+texteDebut->w;//centrage du mot dans la zone de bouton
     
        SDL_BlitSurface(texteDebut, NULL, ecran, &positionTexteDebut);
        SDL_BlitSurface(texteFin, NULL, ecran, &positionTexteFin);
     
        SDL_Flip(ecran);
        SDL_FreeSurface(texteDebut);
        SDL_FreeSurface(texteFin);
    }
     
    void  EcrireTexteEntierCaractere(SDL_Surface *ecran, TTF_Font *police,int NbMax, int positionY)
    {
     
        int i;
        char texte[10];
        SDL_Surface *texteAAfficher=NULL;
        SDL_Rect positionTexte= {400, positionY, 0, 0};//centrage du mot dans la zone de bouton
     
        for (i=0; i<10; i++)
        {
            sprintf(texte, "%d", i);
            texteAAfficher=TTF_RenderText_Blended(police, texte, couleurTexteVert);
            positionTexte.x=positionTexte.x+texteAAfficher->w;
            SDL_BlitSurface(texteAAfficher, NULL, ecran, &positionTexte);
        }
     
        SDL_Flip(ecran);
        SDL_FreeSurface(texteAAfficher);
    }
     
    int main(int argc, char **argv)
    {
        SDL_Surface *ecran=NULL;
        TTF_Font *police = NULL;//declaration de la police d'ecriture
     
        initSDL(&ecran);
        police = TTF_OpenFont("times.ttf", 30);//chargement de la police d'ecriture et de la taille
        if(police == NULL)
        {
            fprintf(stderr, "Erreur de police");
        }
     
        EcrireTexte(ecran, police, "Bonjour",100);//chargement du style et de la taille d'ecriture
        EcrireTexteRacourci(ecran, police, "Salut",200);//chargement du style et de la taille d'ecriture
        EcrireTexteDecompose(ecran, police, "Bien","tot",100);//chargement du style et de la taille d'ecriture
        EcrireTexteDecompose(ecran, police, "","Bravo",200);//chargement du style et de la taille d'ecriture
        EcrireTexteEntierCaractere(ecran, police,10,300);
     
        SDL_Delay(3000);
     
        TTF_CloseFont(police); // Fermeture de la police, doit être fermée avant TTF_Quit()
        TTF_Quit();
        SDL_Quit();
     
        return EXIT_SUCCESS;//on quitte le jeu avec succes
    }
    1ere amélioration souhaitée : j'ai vu dans un forum quelqu'un qui conseillait de passer la police en #define afin de ne pas la passer en paramètre à chaque fois, mais sans expliquer comment on fait.

    2eme amélioration souhaitée : habituellement, j'affiche mon texte en utilisant la fonction "EcrireTexte" (méthode souvent vue dans le forum). Puis j'ai vu une fois quelqu'un qui la raccourcissait en utilisant la méthode de "EcrireTexteRacourci". Est-ce toujours applicable ? Est-ce pratique d'imbriquer directement le TTF_RenderText_Blended dans le SDL_BlitSurface sans définir le SDL_Surface *texte puis le SDL_FreeSurface(texte).

    3eme amélioration souhaitée : l'idée est de coller les deux parties d'un mot coupés en 2 et d'afficher chaque partie d'une manière différente (couleur, gras italique, souligné...).
    * La méthode "accélérée" ferait gagner quelque lignes (déclaration, free). Par contre comme je veux juxtaposer les deux parties, je ne serais plus capable de faire "positionTexteFin.x= positionTexteDebut.x+texteDebut->w;" car "texteDebut" n'existera plus , donc obligé d'utiliser la méthode normale ou existe-t-il une astuce?
    * De plus si une des parties est vide "", j'ai constaté que dans ce cas "texteDebut->w" n'existait pas alors que je pensais qu'elle serait égale à 0. Est-ce normal? D'où les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(strcmp(motDebut,"")==0)
            positionTexteFin.x= positionTexteDebut.x;
        else
            positionTexteFin.x= positionTexteDebut.x+texteDebut->w;//centrage du mot dans la zone de bouton
    N'y a-t-il pas une solution de remplacer cette comparaison par quelque chose de plus "simple"?

    4eme amélioration souhaitée : je veux afficher une variable entier en texte.
    Suis-je vraiment obligé d'utiliser texte et texteAAffiche? N'existe-t-il pas un raccourci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        char texte[10];
        SDL_Rect positionTexte= {400, positionY, 0, 0};//centrage du mot dans la zone de bouton
        SDL_Surface *texteAAfficher=NULL;
     
        sprintf(texte, "%d", i);
        texteAAfficher=TTF_RenderText_Blended(police, texte, couleurTexteVert);
        SDL_BlitSurface(texteAAfficher, NULL, ecran, &positionTexte);
    free()
    Merci à tous ceux qui voudront bien prendre le temps de me répondre.
    ludovic

  2. #2
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Alors pour répondre :
    1) Je pense que le #define c'est pour l'utiliser comme une macro (donc sur une macro tu peux mettre les arguments que tu veux) , mais bon pas forcément utile ici

    2)Alors non je vois pas l’intérêt d'écrire avec EcrireTexteRacourci , non seulement c'est "illisible" pour celui qui lis ton code source , mais en plus le compilo aime moyennement ,il faut mieux un code clair (et donc le compilo arrivera à optimiser aux mieux).

    3) Alors si le but est d'afficher ,couleur, gras italique, souligné , moi je te conseille de faire un texte formaté donc une fonction qui analysera le texte , par exemple :
    "mon texte **gras** ---souligné--- **---gras et souligné---**" etc etc , c'est l'idée , ta fonction enlèverais les double * et les triple - en affichant le texte gras et/ou souligné etc etc.

    4)Oui bienvenue au C , mais rien ne t’empêche de faire une fonction plus "haut niveau" qui ne te met que les info utile que tu as besoin

    Petite remarque personnelle , mais plus on se veut être généraliste et gérer tout les cas de figure et plus le code demandera d'info et sera "plus long".
    Mais dans un cas d'un Jeux Vidéo , on peut vraiment simplifier au max ( je n’utilise plus SDL_TTF mais des bitmap font ).

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 59
    Par défaut
    Merci d'avoir pris le temps de me répondre.
    Finalement, je ne vais apporter aucune modification à mon programme et rester avec mes fonctions.
    En fait, j'utilise le texte principalement pour afficher mes boutons.

    Par exemple, un bouton "Nouveau" avec le "N" souligné, écrit en noir (pour indiquer qu'un raccourci clavier existe), puis parfois "Nouveau" tout en gris, sans le "N" (raccourci clavier inactif).

    Par contre je ne connais pas les bitmap, ni leur principe. Est-ce vraiment pratique?

    Ludo

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Ah par contre j'ai oublié de dire qu'il faut virer SDL_Flip(ecran); Si tu le fais trop fréquemment , tu risque d'avoir des clignotement assez sévère :p
    Il faut le faire qu'une fois par frame(en plus c'est une fonction vraiment lourde , donc il faut le faire le minimum de fois).
    De toute façon on ne flip pas quand on fait une modif mais quand l'ensemble de la scène est écrite.

    Le bitmap font , c'est de prendre une image/texture contenant tout l'alphabet comme ceci par exemple : https://opengameart.org/content/good...ors-pixel-font
    Et de l'afficher comme une simple image, c'est assez rapide (on ne charge que l'image une seule fois) , changer les couleurs peut se faire rapidement (en changeant la palette).
    L'inconvénient c'est qu'on ne peut pas changer la taille du texte (c'est problématique quand on veut faire un éditeur de texte ou autre) dans un JV c'est rarement un souci (on reste sur 2-3 police grand max ).

    Tout les jeux vidéo des années 80 jusqu'aux années 2003 (sur console) utilisait ce procédé.

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 59
    Par défaut
    Pour les SDL_Flip(ecran), c'est une erreur de copier coller de ma part, en principe, je les met dans le main.
    Pour le reste, je vais regarder.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Généralités] [WD19] Conseils pour utiliser nativement une base SQL autre que HyperFile
    Par EriCstoFF dans le forum WinDev
    Réponses: 20
    Dernier message: 24/04/2014, 12h05
  2. [2.x] Conseil pour utiliser Symfony2 sans Doctrine2
    Par grinder59 dans le forum Symfony
    Réponses: 4
    Dernier message: 31/03/2014, 16h24
  3. demande de conseil pour utilisation de grep
    Par JoneZy dans le forum Linux
    Réponses: 2
    Dernier message: 01/11/2009, 12h11
  4. Réponses: 1
    Dernier message: 06/10/2009, 10h39
  5. Réponses: 3
    Dernier message: 24/12/2004, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo