Partage
  • Partager sur Facebook
  • Partager sur Twitter

[langage C] [SDL_ttf] Petite question

comment aller à ligne avec SDL_ttf

Sujet résolu
    1 mai 2011 à 22:58:05

    Bon ben voilà je crois que tout est dans le titre : Je voudrais aller à la ligne avec SDL_ttf parce que quand je vois que quand j'écris un grand texte il dépasse de l'écran et on ne peux pas voir le bout ben c'est pas très pratique. Dois-je forcément faire deux SDL_Surface alignées verticalement et décalées d'une vingtaine de pixels ou il y a une autre solution par exemple comme le \n en console dans printf(""); ou y aurai t-il même une façon un peu plus automatique d'aller à la ligne ?

    Merci d'avance pour vos réponses,

    tsunami33
    • Partager sur Facebook
    • Partager sur Twitter
    qry = 2b || !2b
      2 mai 2011 à 6:58:32

      Bonjour
      comment fais tu si ton image dépasse ta surface écran ?
      Et comment fais tu pour afficher une image en dessous d'une autre?
      @+
      • Partager sur Facebook
      • Partager sur Twitter
        2 mai 2011 à 11:37:08

        Salut,

        Tu test le '\n' et sois tu as ta réponse ou soit tu posts pour nous dire que ça marche pas. Comme ça, ça élimine des hypothèses.
        • Partager sur Facebook
        • Partager sur Twitter
          2 mai 2011 à 23:29:15

          Ben le \n j'avais déjà testé instinctivement. Mai si j'ai bien compris, après maintes recherches sur le web, il faut que je me code une fonction d'affichage à laquelle j'envoie la police, la taille de la police, le texte à afficher, la largeur de l'écran et la position initiale de la première lettre.
          Ma fonction pourrai soit être simple et ne faire que rechercher les \n dans le texte et dans ce cas là elle blitte le reste du texte tailleDeMaPolice en dessous et ainsi de suite jusqu'à ce que tous les \n soient écoulés et le texte finalement affiché ou alors ma fonction pourrai aussi (un peu plus dur) aller à la ligne automatiquement. Grâce à la largeur max du texte. (largeur écran - positionPermiereLettre.x - positionMaximaleDArriveeDuTexteADroite) (ça fait un paramètre en plus) et là j'irais à la ligne en blittant le texte tailleDeMaPolice pixels en dessous. Mouais bon je vais faire les deux. Je vous tiens au courant et vous passe ma fonction quand je l'aurais codé.
          • Partager sur Facebook
          • Partager sur Twitter
          qry = 2b || !2b
            6 mai 2011 à 1:03:46

            Voilà ça y est j'ai fait trois fonctions (une pour chaque mode d'écriture) qui gère le \n et le retour à la ligne automatique. Et vous avez intérêt à être contents parce que là j'ai passé des heures sur ces fonctions :p
            Voilà alors vous pourrez inclure un fichier texte.h :
            #ifndef DEF_AUTRE
                #define DEF_AUTRE
            
                void ecrire_Shaded (SDL_Surface EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte, SDL_Color couleurDuFondDuTexte);
                void ecrire_Blended (SDL_Surface EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte);
                void ecrire_Solid (SDL_Surface EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte);
            
            #endif
            

            et un fichier texte.c ou texte.cpp :
            void ecrire_Shaded (SDL_Surface *EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte, SDL_Color couleurDuFondDuTexte)
            {
                int i = 0, continuerEcrire = 1, isAntislashN = 0;
                char *motAPlacer = NULL;
                TTF_Font *policeDEcriture = NULL;
                motAPlacer = (char *)malloc(strlen(texteAAfficher) * sizeof(char) + 1);
                if (motAPlacer == NULL)
                {
                    printf("Erreur de la fonction ecrire_Shaded\nl'allocation dynamique/Le malloc ne fonctionne pas\nErreur surement en raison de la taille du texte a afficher\nSi ce n'est pas le cas veuillez relancer le programme et reessayer.\n");
                    exit(0);
                }
                policeDEcriture = TTF_OpenFont(nomDeLaPolice, tailleDeLaPolice);
                SDL_Surface *surfaceTexte = {NULL}, *espace = {NULL};
                SDL_Rect positionDuMot;
                positionDuMot.x = positionDeDepartDuTexte.x;
                positionDuMot.y = positionDeDepartDuTexte.y;
            
                espace = TTF_RenderText_Shaded(policeDEcriture, " ", couleurDuTexte, couleurDuFondDuTexte);
            
                while(continuerEcrire)
                {
                    while (texteAAfficher[i] != '\n' && texteAAfficher[i] != '\0' && texteAAfficher[i] != ' ')
                    {
                        motAPlacer[i] = texteAAfficher[i];
                        i++;
                    }
                    if (texteAAfficher[i] == '\0')
                        continuerEcrire = 0;
                    else
                    {
                        if (texteAAfficher[i] == '\n')
                            isAntislashN = 1;
                        else
                        {
                            motAPlacer[i] = texteAAfficher[i];
                            isAntislashN = 0;
                        }
                        surfaceTexte = TTF_RenderText_Shaded(policeDEcriture, motAPlacer, couleurDuTexte, couleurDuFondDuTexte);
                        if (positionDuMot.x + surfaceTexte->w + espace->w > xMaximal)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                        SDL_BlitSurface(surfaceTexte, NULL, EcRaN, &positionDuMot);
                        positionDuMot.x += surfaceTexte->w;
                        if (isAntislashN)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                    }
                }
            
                SDL_FreeSurface(surfaceTexte);
                SDL_FreeSurface(espace);
                free(motAPlacer);
                TTF_CloseFont(policeDEcriture);
            }
            
            void ecrire_Blended (SDL_Surface *EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte)
            {
                int i = 0, continuerEcrire = 1, isAntislashN = 0;
                char *motAPlacer = NULL;
                TTF_Font *policeDEcriture = NULL;
                motAPlacer = (char *)malloc(strlen(texteAAfficher) * sizeof(char) + 1);
                if (motAPlacer == NULL)
                {
                    printf("Erreur de la fonction ecrire_Shaded\nl'allocation dynamique/Le malloc ne fonctionne pas\nErreur surement en raison de la taille du texte a afficher\nSi ce n'est pas le cas veuillez relancer le programme et reessayer.\n");
                    exit(0);
                }
                policeDEcriture = TTF_OpenFont(nomDeLaPolice, tailleDeLaPolice);
                SDL_Surface *surfaceTexte = NULL, *espace = NULL;
                SDL_Rect positionDuMot;
                positionDuMot.x = positionDeDepartDuTexte.x;
                positionDuMot.y = positionDeDepartDuTexte.y;
            
                espace = TTF_RenderText_Blended(policeDEcriture, " ", couleurDuTexte);
            
                while(continuerEcrire)
                {
                    while (texteAAfficher[i] != '\n' && texteAAfficher[i] != '\0' && texteAAfficher[i] != ' ')
                    {
                        motAPlacer[i] = texteAAfficher[i];
                        i++;
                    }
                    if (texteAAfficher[i] == '\0')
                        continuerEcrire = 0;
                    else
                    {
                        if (texteAAfficher[i] == '\n')
                            isAntislashN = 1;
                        else
                        {
                            motAPlacer[i] = texteAAfficher[i];
                            isAntislashN = 0;
                        }
                        surfaceTexte = TTF_RenderText_Blended(policeDEcriture, motAPlacer, couleurDuTexte);
                        if (positionDuMot.x + surfaceTexte->w + espace->w > xMaximal)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                        SDL_BlitSurface(surfaceTexte, NULL, EcRaN, &positionDuMot);
                        positionDuMot.x += surfaceTexte->w;
                        if (isAntislashN)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                    }
                }
            
                SDL_FreeSurface(surfaceTexte);
                SDL_FreeSurface(espace);
                free(motAPlacer);
                TTF_CloseFont(policeDEcriture);
            }
            
            void ecrire_Solid (SDL_Surface *EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte)
            {
                int i = 0, continuerEcrire = 1, isAntislashN = 0;
                char *motAPlacer = NULL;
                TTF_Font *policeDEcriture = NULL;
                motAPlacer = (char *)malloc(strlen(texteAAfficher) * sizeof(char) + 1);
                if (motAPlacer == NULL)
                {
                    printf("Erreur de la fonction ecrire_Shaded\nl'allocation dynamique/Le malloc ne fonctionne pas\nErreur surement en raison de la taille du texte a afficher\nSi ce n'est pas le cas veuillez relancer le programme et reessayer.\n");
                    exit(0);
                }
                policeDEcriture = TTF_OpenFont(nomDeLaPolice, tailleDeLaPolice);
                SDL_Surface *surfaceTexte = NULL, *espace = NULL;
                SDL_Rect positionDuMot;
                positionDuMot.x = positionDeDepartDuTexte.x;
                positionDuMot.y = positionDeDepartDuTexte.y;
            
                espace = TTF_RenderText_Solid(policeDEcriture, " ", couleurDuTexte);
            
                while(continuerEcrire)
                {
                    while (texteAAfficher[i] != '\n' && texteAAfficher[i] != '\0' && texteAAfficher[i] != ' ')
                    {
                        motAPlacer[i] = texteAAfficher[i];
                        i++;
                    }
                    if (texteAAfficher[i] == '\0')
                        continuerEcrire = 0;
                    else
                    {
                        if (texteAAfficher[i] == '\n')
                            isAntislashN = 1;
                        else
                        {
                            motAPlacer[i] = texteAAfficher[i];
                            isAntislashN = 0;
                        }
                        surfaceTexte = TTF_RenderText_Solid(policeDEcriture, motAPlacer, couleurDuTexte);
                        if (positionDuMot.x + surfaceTexte->w + espace->w > xMaximal)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                        SDL_BlitSurface(surfaceTexte, NULL, EcRaN, &positionDuMot);
                        positionDuMot.x += surfaceTexte->w;
                        if (isAntislashN)
                            positionDuMot.y += ecartEntreChaqueLigne + tailleDeLaPolice;
                    }
                }
            
                SDL_FreeSurface(surfaceTexte);
                SDL_FreeSurface(espace);
                free(motAPlacer);
                TTF_CloseFont(policeDEcriture);
            }
            

            Voili voilou bon allez maintenant je vais vous expliquer comment on utilise les fonctions :
            Bon alors le prototype de ecrire_Blended() (qui est le même que la fonction ecrire_Solid() d'aileurs) est le suivant :
            void ecrire_Blended (SDL_Surface *EcRaN, char *nomDeLaPolice, int tailleDeLaPolice, char *texteAAfficher, SDL_Rect positionDeDepartDuTexte, int xMaximal, int ecartEntreChaqueLigne, SDL_Color couleurDuTexte)
            

            Pour ecrire_Shaded() il y aura un paramètre de plus : la couleur de fond du texte. Il faudra l'indiquer en dernier paramètre.

            Pour utiliser ces fonctions il faudra auparavant appeler TTF_Init() et appeler TTF_Quit() après.

            Voici donc tous les paramètres et leur description :
            • SDL_Surface *EcRaN : c'est la surface principale, celle que vous avez envoyé à SDL_SetVideoMode. Elle est généralement appelée ecran mais pour ne pas avoir de problème avec des noms qui seraient les mêmes que des variables globales, je l'ai écrit un peu bizarrement. En gros si votre surface s'appelle ecran alors mettez ecran à ce paramètre
            • char *nomDeLaPolice : Ici vous mettez le nom de la police. Par exemple si votre police se situe dans un dossier appelé polices et que votre fichier de police s'appelle micross.ttf alors vous mettrez "polices/micross.ttf" à ce paramètre
            • int tailleDeLaPolice : Bon ben là c'est juste la taille du texte que vous voulez. Par exemple si vous voulez écrire en taille 12 alors vous mettez 12 à ce paramètre. Rien de plus simple.
            • char *texteAAfficher : Ici vous indiquerez le texte que vous voulez écrire. Par exemple si vous voulez écrire "Salut les Zéros !" alors vous n'aurez qu'à mettre "Salut les Zéros !" à ce paramètre.
            • SDL_Rect positionDeDepartDuTexte : Ici vous enverrez une variable de type SDL_Rect qui indiquera où commencera votre texte.
            • int xMaximal : Ici vous indiquerez où le texte doit passer à la ligne. Le texte n dépassera pas ce point. Par exemple si vous voulez que la fonction laisse toujours un espace minimal de 10 pixels entre le bord droit de votre fenêtre et votre texte alors vous mettrez ecran->w - 10 à ce paramètre (bien sûr vous écrirez ecran seulement si la variable de surface qui contient votre fenêtre s'appelle ecran.
            • int ecartEntreChaqueLigne : Ici par exemple si vous voulez qu'il y ait un espace de 10 pixels entre chacunes de vos lignes (pour ne pas que le bas de votre 1ère ligne soit collé au haut de votre 2ème ligne) alors vous mettrez simplement 10 à ce paramètre.
            • SDL_Color couleurDuTexte : Ici vous enverrez simplement une variable de type SDL_Color qui indiquera en quelle couleur vous écrivez votre texte.
            • Seulement si vous utilisez ecrire_Shaded : SDL_Color couleurDuFondDuTexte : Même chose que pour le précédent sauf qu'ici on indique la couleur qui sera en fond du texte.

            Je compte améliorer ces fonctions dans les plus brefs délais pour qu'elles gèrent par exemple la mise en italique, en gras ou le soulignage. Je compte aussi faire une fonction équivalente au scanf() de la console.
            Voilà si vous avez des questions n'hésitez pas à m'envoyer un MP. Je vous répondrai au plus vite et posterai votre question en édit de mon message (vous ne pouvez pas poster de réponses le sujet est résolu).
            Cordialement,
            tsunami33
            • Partager sur Facebook
            • Partager sur Twitter
            qry = 2b || !2b
              24 juin 2011 à 21:53:49

              Je ne sais pas si je dois être le plus heureux du monde ou pensez à intégrer dans mon cerveau des pensées suicidaires pour débilité suprême.
              Sachez tout d'abord que ça y est !!! J'ai résolu mon problème d'écriture de texte !!!
              Je vais enfin pouvoir continuer le développement de mon jeu ! C'est pour cette raison que je suis sensé être le plus heureux du monde. :D
              En revanche, si je dois instaurer des idées suicidaires pour débilité suprême en moi, c'est parce que j'avais tout simplement arrêté SDL_ttf avec TTF_Quit() AVANT d'écrire du texte. C'est comme si j’éteignais mon ordinateur et que je m'étonnais que mon écran ne m'affiche pas ce que je veut. C'est pitoyable je sais. :'(:'(:'(
              Bon je peux quand même me consoler sur le fait que je n'ai pas galéré qu'à cause de ça. J'ai eu d'autres problèmes pour réussir à écrire mon texte. Mais bon quand même je vous avoue que j'était en train d'apprendre le C++ et la SFML pour faire une reconstruction de mon projet. L'avantage est aussi que j'en ai appris plus qu'il n'en faut à présent sur SDL_ttf.
              Bon eh bien je n'ai plus qu'à mettre problème résolu sur tous les topics où j'ai posté mon problème (plus ou moins différemment) et je peux vous dire qu'il y en a pas mal. :honte:
              • Partager sur Facebook
              • Partager sur Twitter
              qry = 2b || !2b

              [langage C] [SDL_ttf] Petite question

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown