Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le mouvement avec SDL

comment arrêter Zozor ?

Sujet résolu
    17 mai 2007 à 21:36:13

    Bonjours à tous

    J'essaye de modifier le programme de M@teo21 dans la partie du temps sur SDL afin de choisir si Zozor bouge ou s'arrête en appuyant la touche P. J'arrive à le faire démarrer quand il est arrêté mais je n'arrive pas à le stopper.

    Pourriez-vous m'indiquer l'erreur de mon code ?

    Citation : Pas de titre



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

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran=NULL, *zozor=NULL;
        SDL_Event event;
        SDL_Rect positionZozor;
        int continuer=1, tempsPrecedent=0, tempsActuel=0, versLaDroite=1, versLeBas=1, bouger=0;

        SDL_Init(SDL_INIT_VIDEO);
        ecran=SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
        SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));

        zozor=SDL_LoadBMP("zozor.bmp");
        SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

        positionZozor.x=ecran->w/2-zozor->w/2;
        positionZozor.y=ecran->h/2-zozor->h/2;
        SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);

        SDL_Flip(ecran);


        while(continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer=0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_p:
                            if(bouger==1)
                                bouger=0;
                            else
                                bouger=1;
                            break;
                        default:
                            break;
                    }
            }

            if(bouger)
            {
                tempsActuel=SDL_GetTicks();
                if(tempsActuel-tempsPrecedent>30)
                {
                    if(versLaDroite)
                        positionZozor.x++;
                    else
                        positionZozor.x--;
                    if(versLeBas)
                        positionZozor.y++;
                    else
                        positionZozor.y--;
                    tempsPrecedent=tempsActuel;
                }
                else
                    SDL_Delay(30-(tempsActuel-tempsPrecedent));

                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                SDL_Flip(ecran);

                if(positionZozor.x>=ecran->w-zozor->w&&versLaDroite==1)
                    versLaDroite=0;
                else if(positionZozor.x<=0&&versLaDroite==0)
                    versLaDroite=1;
                if(positionZozor.y>=ecran->h-zozor->h&&versLeBas==1)
                    versLeBas=0;
                else if(positionZozor.y<=0&&versLeBas==0)
                    versLeBas=1;
            }
        }

        SDL_Quit();

        return EXIT_SUCCESS;
    }




    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2007 à 22:38:27

      met un fprintf(stderr, "%d", bouger) avant ta condition if(bouger)...tu vas comprendre pourquoi. En logique le programme est correct.
      D'ailleurs en utilisant deux touches distinctes, une pour bouger zozor et une autre pour l'arrêter tu verrais que tu n'aurais plus le problème...
      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2007 à 12:23:44

        Merci pour ta réponse. Je suis sous Linux donc je n'ai pas de fichier stderr mais quand je met la condition d'arrêt avec une autre touche, elle marche.
        Par contre je ne comprend toujours pas pourquoi je ne peux pas avoir les deux conditions avec la même touche.
        • Partager sur Facebook
        • Partager sur Twitter
          18 mai 2007 à 12:32:11

          J'ai eu un problème similaire et je me suis apercu que c'était à cause de SDL_PollEvent, avec ta touche tu as ce que l'on pourrait appeler un "rebond" ce qui fait que l'appui sur la touche peut être detecté un grnad nombre de fois et s'il est paire ce nombre et bien tu retourne à la case départ...

          Je ne sais pas si c'est de là que vient ton problème mais je propose tout de même ;)
          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2007 à 15:27:00

            exactement yenlui, Doctor zero c'est ce que je voulais te faire remarquer en écrivant le résultat dans un fichier.
            On peut voir comme résultat par exemple:
            00000110000000 au moment de l'appui sur la touche ou aussi 00001010101010000 ce qui montre qu'au moment où tu appuie sur la touche le programme a le temps de faire plusieurs boucles et il y a comme un "faux contact" on pourrais dire de la touche qui est testée plusieurs foiset donc renvoie 1 ou 0.
            Tu remarquera d'ailleurs que dans ton code il est possible que tu le arrive à stopper zozor mais ça ne fonctionne pas à tous les coups.
            Avec deux touches le problème s'évapore car il n'y a plus de condition.
            • Partager sur Facebook
            • Partager sur Twitter
              18 mai 2007 à 17:01:03

              Merci beaucoup pour toutes vos réponses.
              • Partager sur Facebook
              • Partager sur Twitter

              Le mouvement avec SDL

              × 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