Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de clignottement

    19 juin 2006 à 7:24:17

    Salut,

    J'ai créer un application qui fais clignotter une image, j'ai donc mis un SDL_Delay(1000), enfin pas tout à fait, car ma fonction réussi à calculer parfaitement le clignottement avec un truc de ce genre :

    SDL_Delay(DELAY - (tempsActuel - tempsPrecedent));

    La ou sa se corse, c'est que je dois réduire le délai (au lieu de 1000, j'indique 100 ou 50) pour mieux gérer la souris, car la fenetre dois se masquer rapidement si la souris passe par dessus. Mais si je réduit le délai, l'image clignotte plus rapidement o_O

    J'ai essayé plusieurs moyen de rendre le clignottement fluide à nouveau, j'ai réussi à effectuer un clignottement quasi normal, mais qui a des raté, l'image reste affiché ou masqué un peu trop longtemps, ce qui est visible à l'oeil, avez-vous une idée ?

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2006 à 8:21:49

      Salut !

      Pour ton probleme, vires le SDL_Delay.
      Utilises plutot les ticks en recuperant le temps actuel et en le comparant avec le temps réccupéré en dernier:
      #define DELAY 1000 //délai du clignotement en ms

      /* balblabla du debut du programme */
      long tempsPrecedant=0;
      /*  ....  */
      tempsPrecedant = SDL_GetTicks();

      /* Boucle Principale */
      While(running)
      {
              /*   .....  */
              if ( SDL_GetTicks() - tempsPrecedant >= DELAY )
              {
                      tempsPrecedant = SDL_GetTicks();
                      /* C'est bon tu peux afficher l'ecran */
              }
              else
              {
                      /* Tu masques l'ecran */
              }
              /*   .....  */
      }

      Voila.
      Par contre j'ai pas compris de l'histoire de survolement de la souris.
      ++ !NiCo!
      • Partager sur Facebook
      • Partager sur Twitter
        19 juin 2006 à 11:06:44

        D'accord, mais si je fais sa, mon application prendra 100% du processeur :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          19 juin 2006 à 12:56:02

          Pour bouffer moins de CPU, ajoutes ca : SDL_Delay(DELAY - (SDL_GetTicks() - tempsPrecedant)); comme ceci :
          #define DELAY 1000 //délai du clignotement en ms

          /* balblabla du debut du programme */
          long tempsPrecedant=0;
          /*  ....  */
          tempsPrecedant = SDL_GetTicks();

          /* Boucle Principale */
          While(running)
          {
                  /*   .....  */
                  if ( SDL_GetTicks() - tempsPrecedant >= DELAY )
                  {
                          tempsPrecedant = SDL_GetTicks();
                          /* C'est bon tu peux afficher l'ecran */
                  }
                  else
                  {
                          SDL_Delay(DELAY - (SDL_GetTicks() - tempsPrecedant));
                          /* Tu masques l'ecran */
                  }
                  /*   .....  */
          }
          • Partager sur Facebook
          • Partager sur Twitter
            19 juin 2006 à 13:32:39

            Retour à la case départ... je sais pas si tu a lu mon premier message o_O
            J'ai déja un DELAY de 1000, je désire le réduire sans affecter le clignottement !
            • Partager sur Facebook
            • Partager sur Twitter
              19 juin 2006 à 13:39:52

              Ah oui excuse moi j'avais pas fais gaffe.
              Ben dans le else, au lieu de mettre un gros delay de 1000 par exemple, tu fais une boucle controlée par les ticks comme au debut et dedans tu mets des delays de 50ms par exemple ou alors un SDL_PollEvent.
              Je sais pas si je me suis bien exprimé. Si tu veux que je te donne un exemple avec du code, dis le moi ;)

              EDIT:
              Comme j'avasi un peu de temps devant moi, je m'en suis occupé:
              #define DELAY 1000 //délai du clignotement en ms

              /* balblabla du debut du programme */
              long tempsPrecedant=0, tempsPrecedantBis=0;
              SDL_Event event;
              /*  ....  */
              tempsPrecedant = SDL_GetTicks();
              tempsPrecedantBis = SDL_GetTicks();

              /* Boucle Principale */
              While(running)
              {
                      /*   .....  */
                      if ( SDL_GetTicks() - tempsPrecedant >= DELAY )
                      {
                              tempsPrecedant = SDL_GetTicks();
                              /* C'est bon tu peux afficher l'ecran */
                      }
                      else
                      {
                                              /* Tu masques l'ecran */
                              if ( SDL_GetTicks() - tempsPrecedant >= DELAY/10 ) //  DELAY/10  fais une pause de 100ms dans ce cas
                                              {
                                                      tempsPrecedantBis = SDL_GetTicks();
                                                      SDL_PollEvent(&event);
                                              }
                                              else
                                              {
                                                      SDL_Delay(DELAY/10 - (SDL_GetTicks() - tempsPrecedantBis));
                              }
                      }
                      /*   .....  */
              }


              + !NiCo!
              • Partager sur Facebook
              • Partager sur Twitter
                19 juin 2006 à 16:21:45

                j'ai tester ça et ça semble marcher. par contre il peut rester des morceau d'autres test dans ce code.

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

                #define DELAY 100


                int main(int argc, char *argv[])
                {
                    SDL_Surface *ecran = NULL, *sFond;/** -----l'image a faire clignoter----- */
                    SDL_Rect pFond;
                    SDL_Event event;
                    int continuer = 1, i;
                    long lTemp = 0;/** -----pour stocker un SDL_GetTicks temporairaire----- */

                    SDL_Init(SDL_INIT_VIDEO);

                    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                    SDL_WM_SetCaption("Test de Police", NULL);

                    sFond = SDL_LoadBMP("lac_en_montagne.bmp");

                    pFond.x = 0;
                    pFond.y = 0;

                    lTemp = SDL_GetTicks();/** -----on le defini une première fois avant la boucle----- */

                    while (continuer)
                    {
                        SDL_PollEvent(&event);
                        switch(event.type)
                        {
                            case SDL_QUIT:
                                continuer = 0;
                                break;
                            case SDL_KEYDOWN:
                                switch(event.key.keysym.sym)
                                {
                                    case SDLK_ESCAPE:
                                        continuer = 0;
                                        break;
                                }
                                break;
                        }

                        SDL_Delay(DELAY - (SDL_GetTicks() - lTemp));///on attend le temp necessaire pour completer les 100ms
                        lTemp = SDL_GetTicks();///on met à jour les Ticks

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

                        if(i < 10)/// si on a fait moins de 10 tours
                        { ///on affiche l'image
                            SDL_BlitSurface(sFond, NULL, ecran, &pFond);
                        }

                       /**on laisse passer 10 tours pendant lesquels l'image n'est pas affichée*/
                        if(i>=20)///lorsqu'on arrive a 20 on remet la variable i au depart (1)
                            i = 1;

                        i++;///a tous les tours on incremente i

                        SDL_Flip(ecran);
                    }

                    SDL_Quit();

                    return EXIT_SUCCESS;
                }
                • Partager sur Facebook
                • Partager sur Twitter

                Problème de clignottement

                × 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