Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit problème pour ma barre d'énergie

Le "1" ne marche pas !!!

    2 avril 2006 à 13:01:23

    Bonjour

    J'ai fait un code qui crée une barre d'énergie dont la taille varie selon le chiffre contenu dans un #define.

    Ca marche...Sauf lorsque le #define contient un "1" ! Dans ce cas, la fin de la barre nes'affiche pas :'( ...

    Mon code (il faut savoir que les images "début.png" et "fin.png" font chacune 21 pixels de large et "milieu.png" fait 3 pixels de large :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #define POURCENTAGE 50

    void pause();

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL;
        SDL_Surface *lignes[POURCENTAGE] = {NULL};
        SDL_Surface *debut = NULL, *fin = NULL;
        SDL_Rect positionDebut, positionMilieu, positionFin;
        long nombrePixelsTotal = POURCENTAGE * 3 + 21;
        long i = 0;

       
       
        positionDebut.x = 0;
        positionDebut.y = 0;
        positionMilieu.x = 21;
        positionMilieu.y = 0;
        positionFin.x = (POURCENTAGE + 1) * 3 + 21;
        positionFin.y = 0;




        SDL_Init(SDL_INIT_VIDEO);
       
        SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);

        ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_RESIZABLE);
        SDL_WM_SetCaption("Test barre d'énergie", NULL);
       
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
               
               
        if(POURCENTAGE > 0)
        {   
            debut = IMG_Load("debut.png");
       

       
            SDL_BlitSurface(debut, NULL, ecran, &positionDebut);
       
            while(positionMilieu.x <= nombrePixelsTotal)
            {
                                   lignes[i] = IMG_Load("milieu.png");
                                   SDL_BlitSurface(lignes[i], NULL, ecran, &positionMilieu);
                                   i++;
                                   positionMilieu.x += 3;
            }
           
            fin = IMG_Load("fin.png");
            SDL_BlitSurface(fin, NULL, ecran, &positionFin);                       
            }
        pause();

        SDL_FreeSurface(lignes);
        SDL_FreeSurface(debut);
        SDL_FreeSurface(fin);
        SDL_Quit();

        return EXIT_SUCCESS;
    }










    void pause()
    {
        int continuer = 1;
        SDL_Event event;

        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2006 à 16:45:15

      C'est bon, j'ai remplacé
      while(positionMilieu.x <= nombrePixelsTotal)

      par
      while(positionMilieu.x < nombrePixelsTotal)


      et

      positionFin.x = (POURCENTAGE + 1) * 3 + 21;

      par
      positionFin.x = POURCENTAGE * 3 + 21;



      Je vois toujours pas bien d'où vient l'erreur, mais ça c'est pas grave :p
      • Partager sur Facebook
      • Partager sur Twitter
        22 avril 2006 à 9:20:43

        Je remonte le sujet, parce que mon code (que j'ai un peu modifié) marche toujours (désormais il est possible d'allonger ou de rétrecir la barre avec les touches flechées) . Cependant, lorsque je souhaite effacer la surface en faisant un FillRect à chaque tour de boucle, les parties du milieu de ma barre ne s'affichent plus :'( !

        Mon code :

        #include <stdlib.h>
        #include <stdio.h>
        #include <SDL/SDL.h>
        #include <SDL/SDL_image.h>

        void rectifiePourcentage(long *pourcentage);

        int main(int argc, char *argv[])
        {
            SDL_Surface *ecran = NULL;                                                               
            SDL_Surface *lignes[100] = {NULL};                                                       
            long pourcentage = 50;                                                                   
            SDL_Surface *debut = NULL, *fin = NULL;                                                 
            SDL_Rect positionDebut, positionMilieu, positionFin;                                     
            long i = 0, continuer = 1;                                                               
            SDL_Event evenement;                                                                     
           
           
            positionDebut.x = 0;
            positionDebut.y = 0;
            positionMilieu.x = 21;
            positionMilieu.y = 0;
            positionFin.x = pourcentage * 3 + 21;
            positionFin.y = 0;

         
                                           
            SDL_Init(SDL_INIT_VIDEO);
           

           
            SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);

            ecran = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF);
            SDL_WM_SetCaption("Test barre d'énergie", NULL);
           
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

            debut = IMG_Load("debut.png");
           
            while(i < 100)
            {
                                           lignes[i] = IMG_Load("milieu.png");
                                           i++;
            }
           
            fin = IMG_Load("fin.png");
           
             
            i = 0
             
             
            SDL_EnableKeyRepeat(10, 10);
           
            SDL_ShowCursor(SDL_DISABLE);
             
               while(continuer)
               {     
                     
                    SDL_WaitEvent(&evenement);
                         

                                                     
                    rectifiePourcentage(&pourcentage);
                         
                         
                         
                    positionFin.x = pourcentage * 3 + 21;
                         
                         
             
                   
                    if(evenement.type == SDL_KEYDOWN)
                    {
                                      if(evenement.key.keysym.sym == SDLK_RIGHT)
                                      {
                                           pourcentage++;
                                      }
                                     
                                      else if(evenement.key.keysym.sym == SDLK_LEFT)
                                      {
                                           pourcentage--;
                                      }
                                     
                                      else if(evenement.key.keysym.sym == SDLK_ESCAPE)
                                      {
                                           continuer = 0;
                                      }
                    }
                         
                    else if(evenement.type == SDL_QUIT)
                    {
                                      continuer = 0;
                    }     
                     
                     
                     
                   
                   
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                   
                   
                   
                   
                         
                    SDL_BlitSurface(debut, NULL, ecran, &positionDebut);
               
                    while(positionMilieu.x < positionFin.x)
                    {
                                           SDL_BlitSurface(lignes[i], NULL, ecran, &positionMilieu);
                                           i++;
                                           positionMilieu.x += 3;
                    }
                   
                   
           
                    SDL_BlitSurface(fin, NULL, ecran, &positionFin);
                                     
                SDL_Flip(ecran);                               
                }

            SDL_EnableKeyRepeat(0, 0);


            for(i=0;1<100;i++)
            {
                SDL_FreeSurface(lignes[i]);
            }
            SDL_FreeSurface(debut);
            SDL_FreeSurface(fin);
            SDL_Quit();

            return EXIT_SUCCESS;
        }


        void rectifiePourcentage(long *pourcentage)
        {
                    if(*pourcentage < 0)
                    {
                                   *pourcentage = 0;
                    }
                   
                    if(*pourcentage > 100)
                    {
                                   *pourcentage = 100;
                    }
        }


        Merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter

        Petit problème pour ma barre d'énergie

        × 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