Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Probleme affichage texte

    11 octobre 2006 à 20:07:32

    bonsoir,

    j'ai un probleme j'essaye d'afficher un texte en SDL mais il n'apparait pas. j'ai une fenetre toute blanche et quand je supprime le SDL_Flip(ecran) a la fin, bin sa m'affiche l'image mais il me manque toujours le texte


    Voici mon code :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h> /* Ne pas oublier l'include ! */

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *texte = NULL, *fond = NULL, *imageDeFond = NULL;
        SDL_Rect positionFond;
        SDL_Rect position;
        SDL_Event event; /* La variable contenant l'évènement */
        TTF_Font *police = NULL; /* Stockera les informations de police */
        SDL_Color couleurNoire = {0, 0, 0};
        int continuer = 1; /* Notre booléen pour la boucle */
       

        positionFond.x = 0;
        positionFond.y = 0;

        SDL_Init(SDL_INIT_VIDEO);

        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
       
       police = TTF_OpenFont("28dayslater.ttf", 65); /* Ouverture de la police au début */
       /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
        texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
       
           /* Chargement d'une image Bitmap dans une surface */
        imageDeFond = SDL_LoadBMP("background.bmp");
        /* On blitte par-dessus l'écran */
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);

        SDL_Flip(ecran);

       
    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                        continuer = 0;
                        break;
                }
                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); // Quand je le supprime l'image apparait mais il manque toujours le texte
    }


        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_FreeSurface(texte);
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    Pouvez vous m'aidez please merci
    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2006 à 20:20:44

                  switch (event.key.keysym.sym)
                  {
                      case SDLK_ESCAPE: /* Appui sur la touche Echap, on arrête le programme */
                          continuer = 0;
                          break;
                  }

      Peut être simplifié en :
      if(event.key.keysym.sym == SDLK_ESCAPE)
         continuer = 0;


      Dans ton code il faut appuyer sur une touche pour faire apparaitre l'image et le texte.

      Sinon j en'ai rien vu d'incorrect ...

      EDIT : Si tu supprimes le Flip(), tu vois l'image car tu n'as pas rafraichit le blit du fond par dessus.
      • Partager sur Facebook
      • Partager sur Twitter
        11 octobre 2006 à 20:28:51

        meci enfete il falait que je place le switch a la fin.

        #include <stdlib.h>
        #include <stdio.h>
        #include <SDL/SDL.h>
        #include <SDL/SDL_image.h>
        #include <SDL/SDL_ttf.h> /* Ne pas oublier l'include ! */

        int main(int argc, char *argv[])
        {
            SDL_Surface *ecran = NULL, *texte = NULL, *fond = NULL, *imageDeFond = NULL;
            SDL_Rect positionFond;
            SDL_Rect position;
            SDL_Event event; /* La variable contenant l'évènement */
            TTF_Font *police = NULL; /* Stockera les informations de police */
            SDL_Color couleurNoire = {0, 0, 0};
            int continuer = 1; /* Notre booléen pour la boucle */
           

            positionFond.x = 0;
            positionFond.y = 0;

            SDL_Init(SDL_INIT_VIDEO);

            ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
           
           police = TTF_OpenFont("28dayslater.ttf", 65); /* Ouverture de la police au début */
           /* Ecriture du texte dans la SDL_Surface "texte" en mode Blended (optimal) */
            texte = TTF_RenderText_Blended(police, "Salut les Zér0s !", couleurNoire);
           
               /* Chargement d'une image Bitmap dans une surface */
            imageDeFond = SDL_LoadBMP("background.bmp");
            /* On blitte par-dessus l'écran */
            SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);

            SDL_Flip(ecran);

             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); // Quand je le supprime l'image apparait mais il manque toujours le texte
               
               
               
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    if(event.key.keysym.sym == SDLK_ESCAPE)
           continuer = 0;
                    break;
                    }
                   
                            SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

               
        }


            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_FreeSurface(texte);
            SDL_Quit();

            return EXIT_SUCCESS;
        }


        par contre je ne voi toujours pas la phrase

        merci de votre aide
        • Partager sur Facebook
        • Partager sur Twitter
          11 octobre 2006 à 20:33:41

          Salut,

          Permet-moit de réagir à ta simplification Sylicate : Qui te dit qu'il ne va pas vouloir rajouter une gestion des évènements plus poussée par la suite ? Dans ce cas un switch est tout à fait justifié.

          Pour sinops -> la police que tu charges est-elle bien placée dans le même répertoire que ton exécutable ? As-tu bien appuyé sur une touche ? ( en effet ta boucle est bloquée par SDL_WaitEvent, si tu ne veut pas qu'elle soit bloquée, remplace par un SDL_PollEvent ).

          Sinon j'ai repéré deux problèmes : la surface fond n'est pas allouée ni remplie, un Blit dans ce cas est problématique, et tu ne libère pas imageDeFond ( ça à la rigueur c'est pas trop important, en théorie ton OS s'en charge ).

          Edit : c'est quoi cette horreur que tu vient de faire ? L'autre version était mieux, là ça risque pas de t'afficher quelque chose, en effet tu as un FillRect direct ....
          • Partager sur Facebook
          • Partager sur Twitter
            11 octobre 2006 à 21:15:01

            ok je remet comme avant. la police ne se trouver pas dans le dossier de mon executable je te tien au courant.

            EDIT : J'arrive pas a retrouver le chapitre ou il explique comment ne pas prendre 100 % des ressources avec SDL_PollEvent. Pourrai tu me dire ou il se situe

            Merci

            C'est bonj'ai trouvé merci
            • Partager sur Facebook
            • Partager sur Twitter
              12 octobre 2006 à 8:28:12

              Citation : Fradow

              Permet-moit de réagir à ta simplification Sylicate : Qui te dit qu'il ne va pas vouloir rajouter une gestion des évènements plus poussée par la suite ? Dans ce cas un switch est tout à fait justifié.



              Oui je suis tout à fait d'accord. Mais dans le cas où il n'y ait qu'une ou deux possibilité, le if simplifie.


              Citation : Sinops

              police = TTF_OpenFont("28dayslater.ttf", 65);


              ok je remet comme avant. la police ne se trouver pas dans le dossier de mon executable je te tien au courant.


              Dans ce cas :
              police = TTF_OpenFont("C:\\Windows\\Fonts\\28dayslater.ttf", 65);
              // Il faut que ut vérifies le chemin d'accès ...

              Ou alors tu gardes le code et tu fais une copie du *.ttf dans le dossier de ton executable.

              Citation : Sinops

              EDIT : J'arrive pas a retrouver le chapitre ou il explique comment ne pas prendre 100 % des ressources avec SDL_PollEvent. Pourrai tu me dire ou il se situe



              Regarde le 7eme chapitre avec SDL_Delay, etc.
              • Partager sur Facebook
              • Partager sur Twitter

              [SDL]Probleme affichage texte

              × 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