Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Plusieurs événements en même temps

Sujet résolu
Anonyme
    8 avril 2006 à 12:43:36

    Bonjour!

    Je voudrais savoir quelle est la méthode pour faire marcher plusieurs événements en même temps, car avec la méthode de M@teo, on ne peut faire marcher qu'un événement à la fois :(

    Et merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2006 à 12:46:44

      Oui, ce serais une bonne idée.. je ne sais pas comment on fait parce que par exemple,
      là on ne peut bouger une surface que dans un seul sens...
      Si quelqu'un a une idée. :)
      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2006 à 13:01:01

        A priori SDL_WaitEvent ne va renvoyer qu'un seul évènement. Mais comme la boucle while va très vite, le prochain évènement sera traité et ainsi de suite. Bref, les évènements seront toujours traités un à un, mais au final ça ne se voit pas parce que ça va très vite.

        A moins que vous ne parliez de déplacer une surface dans 2 directions à la fois (en haut à droite ?)
        Dans ce cas c'est une technique (toute conne) qui sera enseignée dans quelques chapitres). Voici ce que vous devez faire :

        - si KEYDOWN du la flèche vers le haut : mettre le booléen flecheHautEnfoncee à 1.
        - si KEYDOWN du la flèche vers la droite : mettre le booléen flecheDroiteEnfoncee à 1.

        Ensuite, vous regardez ce que valent les booléens. Si vous avez :

        if (flecheHautEnfoncee && flecheDroiteEnfoncee )

        Alors vous déplacez Zozor de 1px en haut à droite.

        Ensuite, il ne faut pas oublier de désactiver les booléens lorsqu'on a un évènement KEYUP :

        - KEYUP de flèche haut : flecheHautEnfoncee = 0
        - KEYUP de flèche droite : flecheDroiteEnfoncee = 0


        Voilà avec ça vous devriez vous en sortir ;)
        • Partager sur Facebook
        • Partager sur Twitter

        If you'd like to join us, read "How do we work at OpenClassrooms"! :)

        Anonyme
          8 avril 2006 à 13:25:05

          Merci M@teo, je vais essayer.

          Edit : Ca marche!
          • Partager sur Facebook
          • Partager sur Twitter
            8 avril 2006 à 13:31:12

            Merçi M@teo2 !!! C'est très pratique !!
            Et ça marche !!!(c'est mieu ;))

            EDIT: Aie !
            J'ai un probleme: si j'appuie sur le touche droite, que j'ajoute celle du haut puis que l'enleve, le personnage s'arrete au lieu !!
            Comment faire ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              8 avril 2006 à 17:34:29

              guimers8-> Voici le code complet:


              //Edit 2 : code complet

              int main(int argv, char **argc)
              {
              SDL_Surface *ecran = NULL, *zozor = NULL;
              SDL_Rect positionZozor;

              SDL_Init(SDL_INIT_VIDEO);

              ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

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

              positionZozor.x = 0;
              positionZozor.y = 0;

              SDL_BlitSurface(zozor,NULL,ecran,&positionZozor);

              int continuer = 1, flechehaut = 0, flechedroite = 0, flechegauche = 0, flechebas = 0;

              while(continuer)
              {
              SDL_WaitEvent(&event);
              switch(event.type)
              {
              case SDL_QUIT:
              continuer = 0;
              break;
              case SDL_KEYDOWN:
              switch(event.key.keysym.sym)
              {
              case SDLK_UP: // Flèche haut
              flechehaut = 1;
              break;
                                  case SDLK_DOWN: // Flèche bas
                                      flechebas = 1;
                                  break;
                                  case SDLK_RIGHT: // Flèche droite
                                      flechedroite = 1;
                                  break;
                                  case SDLK_LEFT: // Flèche gauche
                                      flechegauche = 1;
                                  break;
              }
              break;
              case SDL_KEYUP:
                              flechehaut = 0;
                              flechebas = 0;
                              flechedroite = 0;
                              flechegauche = 0;
              break;
              }
              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
              if(flechehaut)
                      {
                          positionZozor.y-=5;
                          if(flechedroite)
                              positionZozor.x+=5;
                          else if(flechegauche)
                              positionZozor.x-=5;
                      }
                      if(flechebas)
                      {
                          positionZozor.y+=5;
                          if(flechedroite)
                              positionZozor.x+=5;
                          else if(flechegauche)
                              positionZozor.x-=5;
                      }
                      if(flechedroite && !flechebas && !flechehaut)
                          positionZozor.x+=5;
                      if(flechegauche && !flechebas && !flechehaut)
                          positionZozor.x-=5;
              SDL_BlitSurface(zozor,NULL,ecran,&positionZozor);
              SDL_Flip(ecran); // Edit: on rafraîchit l'écran.
              }

              SDL_FreeSurface(zozor);
              SDL_Quit();

              return 0;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                8 avril 2006 à 18:07:31

                Moui...ce n'est pas comme cela que j'ai fait, tu ne veut pas passer tout ton Main parce que j'arrive pas à le faire fonctionner..
                Moi j'utilise ça comme boucle d'evenements:
                SDL_EnableKeyRepeat(25, 10);
                   
                    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: // on quitte le programme !
                                     continuer = 0;
                                     break;
                                     
                                case SDLK_UP:
                                     haut = 1;
                                     if(haut == 1 && droite == 1)
                                     {
                                     positionZozor.y--;
                                     positionZozor.x++;   
                                     }
                                     else if(haut == 1 && gauche == 1)
                                     {
                                     positionZozor.y--;
                                     positionZozor.x--;   
                                     }
                                     positionZozor.y--;
                                     break;
                               
                                case SDLK_DOWN:
                                     bas = 1;
                                     if(gauche == 1 && bas == 1)
                                     {
                                     positionZozor.y++;
                                     positionZozor.x--;
                                     }
                                     else if(droite == 1 && bas == 1)
                                     {
                                     positionZozor.y++;
                                     positionZozor.x++;
                                     }
                                     else
                                     {
                                     positionZozor.y++;
                                     }
                                     break;
                                     
                                case SDLK_LEFT:
                                     gauche = 1;
                                     if(haut == 1 && gauche == 1)
                                     {
                                     positionZozor.y--;
                                     positionZozor.x--;   
                                     }
                                     else if(bas == 1 && gauche == 1)
                                     {
                                     positionZozor.y++;
                                     positionZozor.x--;   
                                     }
                                     else
                                     {
                                     positionZozor.x--;
                                     }
                                     break;
                                     
                                case SDLK_RIGHT:
                                     droite = 1;
                                     if(haut == 1 && droite == 1)
                                     {
                                     positionZozor.y--;
                                     positionZozor.x++;   
                                     }
                                     
                                     else if(bas == 1 && droite == 1)
                                     {
                                     positionZozor.y++;
                                     positionZozor.x++;   
                                     }
                                     
                                     else
                                     {
                                     positionZozor.x++;
                                     }
                                     break;
                                   
                                case SDLK_SPACE: // on centre zozor
                                     positionZozor.x = (640 / 2) - (84 / 2);
                                     positionZozor.y = (480 / 2) - (95.0 / 2);
                                     break;
                            }
                            break;
                           
                            case SDL_MOUSEBUTTONUP:
                                 positionZozor.x = event.button.x - (84 / 2); /* On change les coordonnées de Zozor */
                                 positionZozor.y = event.button.y - (95.0 / 2);
                                 break;
                                 
                        case SDL_KEYUP:
                                 switch (event.key.keysym.sym)
                            {
                                 case SDLK_UP:
                                 haut = 0;
                                 break;
                                 
                                 case SDLK_DOWN:
                                 bas = 0;
                                 break;
                                 
                                 case SDLK_LEFT:
                                 gauche = 0;
                                 break;
                                 
                                 case SDLK_RIGHT:
                                 droite = 0;
                                 break;
                            }
                    }
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 1, 40, 99));
                    SDL_BlitSurface(doc, NULL, ecran, &positionDoc);
                    SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                    SDL_Flip(ecran);
                }

                    SDL_Quit();

                    return EXIT_SUCCESS;
                }


                Mais je ne comprend pas, le principe est le meme que pour la tienne, sa devrait donner la meme chose..tu es sur que cela regle mon probleme ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  9 avril 2006 à 11:23:30

                  guimers8-> J'ai édité le code, et j'ai inclus le main.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 avril 2006 à 16:33:35

                    devildante: Je comprends pas pourquoi tu te compliques la vie à tester si flêche haut & flèche gauche puis flêche bas & flêche gauche, etc, puis ensuite les cas ou une seule flêche est enfoncée, etc...
                    Il suffit de tester les booléens un par un et de modifier les coordonnées... Si par exemple flêche haut et flêche droite sont enfoncées, les deux booléens vaudront 1, et alors on test flêche haut qui nous dit que c'est bon, on décrémente en y, puis on test flêche droite qui nous dit que c'est bon, on incrémente en x...
                    Au final les deux valeurs auront changées, et on blit aux nouvelles coordonnées...

                    [EDIT:] J'ai fait un code basé sur le mouvement de zozor de M@téo21 du cours, je fais les test si les touches haut/bas/gauche/droite, sont enfoncées, puis j'incrémente ou décrémente chacune des ordonnées suivant qui est pressé:
                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <SDL/SDL.h>
                    #define DELAI 10

                    int main(int argc, char *argv[])
                    {
                            SDL_Surface *ecran = NULL, *zozor = NULL;
                            SDL_Rect position_zozor;
                            SDL_Event event;
                            int continuer = 0, haut = 0, bas = 0, gauche = 0, droite = 0;
                            int temps = 0, temps_a_attendre = 0;

                            SDL_Init(SDL_INIT_VIDEO);

                            ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double Buffering */
                            SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

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

                            position_zozor.x = ecran->w / 2 - zozor->w / 2;
                            position_zozor.y = ecran->h / 2 - zozor->h / 2;

                            while (!continuer)
                            {
                                    temps = SDL_GetTicks();
                                    SDL_PollEvent(&event);
                                    switch(event.type)
                                    {
                                            case SDL_QUIT:
                                                    continuer = 1;
                                                    break;
                                            case SDL_KEYDOWN:
                                                    switch(event.key.keysym.sym)
                                                    {
                                                            case SDLK_ESCAPE:
                                                                    continuer = 1;
                                                                    break;
                                                            case SDLK_UP:
                                                                    haut = 1;
                                                                    break;
                                                            case SDLK_DOWN:
                                                                    bas = 1;
                                                                    break;
                                                            case SDLK_LEFT:
                                                                    gauche = 1;
                                                                    break;
                                                            case SDLK_RIGHT:
                                                                    droite = 1;
                                                                    break;
                                                    }
                                                    break;
                                            case SDL_KEYUP:
                                                    switch(event.key.keysym.sym)
                                                    {
                                                            case SDLK_UP:
                                                                    haut = 0;
                                                                    break;
                                                            case SDLK_DOWN:
                                                                    bas = 0;
                                                                    break;
                                                            case SDLK_LEFT:
                                                                    gauche = 0;
                                                                    break;
                                                            case SDLK_RIGHT:
                                                                    droite = 0;
                                                                    break;
                                                    }
                                                    break;
                                    }

                                    if(haut)
                                            position_zozor.y--;
                                    if(bas)
                                            position_zozor.y++;
                                    if(gauche)
                                            position_zozor.x--;
                                    if(droite)
                                            position_zozor.x++;

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

                                    if((temps_a_attendre = DELAI-(SDL_GetTicks()-temps)) > 0)
                                            SDL_Delay(temps_a_attendre);
                            }

                            SDL_FreeSurface(zozor);
                            SDL_Quit();

                            return EXIT_SUCCESS;
                    }



                    A noter: Je test !continuer dans ma boucle, c'est pas pour être rebel et pas faire comme tout le monde, mais parceque je trouve plus logique que continuer soit à 1 pour dire qu'on continue... Enfin je trouve que c'est plus clair comme ça alors j'ai pris cette habitude contrairement à M@té021...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      10 avril 2006 à 22:38:58

                      Je veux me compliquer la vie ( :p ) pour qu'il y ait pas des rigolos qui veulent faire bouger leur perso à droite et à gauche :lol:
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 avril 2006 à 13:38:08

                        Bah essayes avec mon code de bouger à droite ET à gauche, Zozor ne bougera tout simplement pas puisque son abscisse est d'abord décrémentée puis réincrémentée, donc au moment du Blit la position reste celle de départ et tout va bien... ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 avril 2006 à 21:03:04

                          sinon il y a:


                          Uint8 *keys;
                          SDL_PumpEvent();
                          keys = SDL_GetKeyState(NULL);

                          • Partager sur Facebook
                          • Partager sur Twitter

                          [SDL] Plusieurs événements en même temps

                          × 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