Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comment gérer 2 événement en même temps?

EX:le perso avance en haut a droite en même temps

Sujet résolu
    13 avril 2006 à 21:06:13

    voila salut tous les zéros, j'aimerais savoir comment on fait pour gerer deux événements en même temps.
    C'est-à-dire que la position change comme cela:
    position originale = (50,50)

    Si j'appuis sur la fleche haut + celle de droite la position devient (49,51).
    fleche haut = decrémentation de y.
    fleche droite = incrémentation de x.
    (si j'ai pas fait d'erreur :p )

    Car pour l'instant si j'appuis sur les deux touches en même temps une seule des actions s'éffectue.

    Merci d'avance :D:D .
    • Partager sur Facebook
    • Partager sur Twitter
      13 avril 2006 à 21:10:59

      Plutot :

      if(fleche droite)
      x++
      else if(fleche gauche)
      x--

      if(fleche haut)
      y--
      else if(fleche bas)
      y++


      Mais il faut pour ça que fleche XXXX reste vrai tant que la touche est appuyée, et passe à faux quand on relache la touche.
      • Partager sur Facebook
      • Partager sur Twitter
        13 avril 2006 à 21:15:31

        Merci mais ton bout de code que j'aurais modifié je le met où?? :p
        • Partager sur Facebook
        • Partager sur Twitter
          13 avril 2006 à 21:43:20

          J'ai exactement le meme probleme avec ce que tu nous propose "WhiteTiGer" voilà ce que j'ai fais:


          SDL_EnableKeyRepeat(1, 1);
              while (continuer) /* TANT QUE la variable ne vaut pas 0 */
              {
              SDL_WaitEvent(&event); /* On attend un évènement qu'on récupère dans event */
              if(event.type==SDL_KEYDOWN)//Si il y a une touche appuyée
                  {
                  if(event.key.keysym.sym==SDLK_RIGHT) // Flèche droite
                     {
                     //Traitement
                     }
                   if(event.key.keysym.sym==SDLK_LEFT) // Flèche gauche
                     {
                      //Traitement
                     }
                   if(event.key.keysym.sym==SDLK_UP)
                     {
                      //Traitement
                     }
                   }
                }


          Mais ça ne marche pas :(
          lorsque j'appuye sur plusieur touche un seul évènement est traité!!! o_O

          quelqu'un à une idée?
          • Partager sur Facebook
          • Partager sur Twitter
            13 avril 2006 à 21:51:52

            Comme l'ai dit Matéo sur un certain topic, il faut mettre le booléen haut à 1 quand on appuie sur SDLK_UP, faire pareil avec les 4 flèches, puis ensuite en bas mettre
            if(haut && gauche)
            {ositionHeros.x += 5, positionHeros.y -= 5 :)}
            • Partager sur Facebook
            • Partager sur Twitter
              13 avril 2006 à 21:54:31

              Le code du cours ne marche pas ?

              switch(event.type)
              {
                  case SDL_QUIT:
                      continuer = 0;
                      break;
                  case SDL_KEYDOWN:
                      switch(event.key.keysym.sym)
                      {
                          case SDLK_UP: // Flèche haut
                              positionZozor.y--;
                              break;
                          case SDLK_DOWN: // Flèche bas
                              positionZozor.y++;
                              break;
                          case SDLK_RIGHT: // Flèche droite
                              positionZozor.x++;
                              break;
                          case SDLK_LEFT: // Flèche gauche
                              positionZozor.x--;
                              break;
                      }
                      break;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                13 avril 2006 à 21:54:52

                Donc clairment fodrai fair ce test?


                if((event.key.keysym.sym==SDLK_LEFT) && (event.key.keysym.sym==SDLK_UP))


                Je vais esséyé :p


                Edit:


                Citation : undefined

                Le code du cours ne marche pas ?



                Non le code du cour permet de traiter qu'un seul évenement à la fois!!

                Bon je vien de fair un test et ce que j'ai marqué ne fonctionne pas

                if((event.key.keysym.sym==SDLK_LEFT) && (event.key.keysym.sym==SDLK_UP))
                • Partager sur Facebook
                • Partager sur Twitter
                  13 avril 2006 à 22:00:57

                  Ok, sinon au pire, y'a un méthode beaucoup plus barbare, c'est d'y aller avec une key_map :


                  unsigned char key_map[256] = {0}

                  void keydown(touche)
                  {
                     switch(touche)
                     {
                     case 'a': key_map['a'] = 1;
                     //etc...
                     }
                  }
                  void keyup(touche)
                  {
                     switch(touche)
                     {
                     case 'a': key_map['a'] = 0;
                     //etc...
                     }
                  }
                  void handlekeys()
                  {
                    if(key_map['a'])
                        // traitement

                     // etc...
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 avril 2006 à 22:02:35

                    *a l'impression de parler dans le vent* :-°
                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 avril 2006 à 22:10:59

                      Citation : N1gHtm@r3

                      *a l'impression de parler dans le vent* :-°


                      Pourquoi dis tu cela?
                      Avec ce que tu as dis j'ai ésséyé ses deux méthodes!

                      if(event.key.keysym.sym==SDLK_UP)
                         {
                         position_mario.y-=1;
                         if(event.key.keysym.sym==SDLK_RIGHT)
                           position_mario.x+=3;
                         }


                      if((event.key.keysym.sym==SDLK_LEFT) && (event.key.keysym.sym==SDLK_UP))


                      Mais aucun des deux n'a fonctionner!

                      Citation : WhiteTiGer



                      unsigned char key_map[256] = {0}

                      void keydown(touche)
                      {
                         switch(touche)
                         {
                         case 'a': key_map['a'] = 1;
                         //etc...
                         }
                      }
                      void keyup(touche)
                      {
                         switch(touche)
                         {
                         case 'a': key_map['a'] = 0;
                         //etc...
                         }
                      }
                      void handlekeys()
                      {
                        if(key_map['a'])
                            // traitement

                         // etc...
                      }



                      Je ne comprends pas trop le but de ce code peux tu mettre quelque commentaire s'il te plait?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        13 avril 2006 à 22:22:24

                        Le principe est simple, tu crées un tableau de booleen (ici uchar vu que bool n'existe pas en C), ce tableau représentera les touches du clavier.

                        Ensuite on choppe les events de la SDL, si c'est un event de type KeyDown, on appelle la fonction keydown avec comme argument la touche pressée.

                        Dans cette fonction on va determiner quelle touche et mettre à jour notre keymap en passant le champs correspondant à la touche pressée à 1.

                        Le fonction keyup fait à peu près la même chose, si ce n'est qu'elle passe le champs correspondant à la touche relachée à 0.

                        La fonction handlekeys() (traduire ~gestionnaire de touche) va vérifier quelle touche est pressée et agir en conséquence (on pourra ainsi traiter plusieurs touches en même temps). Il faut appeler cette fonction juste avant de dessiner ton écran.


                        Ceci dit il existe surement une méthode plus simple avec la SDL...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          13 avril 2006 à 22:26:01

                          daccord je pense comprendre enfin peut-être pas car avec ce que je comprend
                          si l'utilisateur appuye sur une touche on met key_map à 1 sinon à 0 mais on ne gère pas le cas ou il appuye sur 2touche :euh: ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            13 avril 2006 à 22:33:29

                            Si, enfin pas en même temps
                            Imaginons, j'appuie sur la touche A

                            -> Un event est envoyé comme quoi la touche A a été pressée, on passe le relaie a la fonction keydown() qui s'occupe de la mise à jour de la keymap, et tant que je la lache pas, on ne s'occupe plus d'elle.

                            Maintenant j'appuie sur Z
                            --> idem que pour A

                            Au final notre keymap si on ne lache pas ces 2 touches:
                            keymap['A'] vaudra 1
                            et keymap['Z'] vaudra 1

                            Passons dans notre fonction handlekey(), quand on va rencontrer if(keymap['A']), on fera les traitements relatif à cette touche vu que keymap['A'] vaut 1.
                            Pareil pour Z.

                            Donc au final, on traitera bien le fait que et A et Z soient pressés (tu peux même pressée toutes tes touches à la fois, ça marchera aussi, maintenant faut y trouver un interêt...)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              13 avril 2006 à 22:36:24

                              daccord j'ai tout compris ;)

                              je viens de trouver cela

                              sdl-plusieurs-evenements-en-meme-temps

                              Je vais esséyé avec cela si je n'y arrive pas, je vois avec ta méthode

                              Merci de ton aide :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                13 avril 2006 à 22:43:58

                                moi je vais te montrer ma soluce



                                while(1)
                                {
                                        Uint8 * keys = SDL_GetKeyState(NULL);//reçoit la touche appuyée
                                        if (keys[SDLK_RIGHT])//appuis sur la fléche droite
                                        {   
                                            //on incrémente x
                                        }
                                        if (keys[SDLK_LEFT])//appuis sur la fléche gauche
                                        {   
                                            //on décrémente x
                                        }
                                        if (keys[SDLK_UP])//appuis sur la fléche haut
                                        {   
                                            //on décrémente y
                                        }
                                        if (keys[SDLK_DOWN])//appuis sur la fléche bas
                                        {   
                                            //on incrémente y
                                        }

                                }



                                dans mon jeu de shoot ca gére les déplacement méme en diagonale.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  13 avril 2006 à 22:45:26

                                  Okay, derien ^^
                                  Par contre, c'est exactement la même méthode, la mienne est juste plus générale et te permet de gérer toutes les touches du clavier.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 avril 2006 à 22:56:11

                                    Bon voilà ça marche avec la méthode SDL ;) et en plus j'ai tout compris :p

                                    Citation : WhiteTiGer

                                    Par contre, c'est exactement la même méthode, la mienne est juste plus générale et te permet de gérer toutes les touches du clavier.



                                    Oui c'est la meme méthode, mais là SDL gére aussi toutes les touches du clavier ;)

                                    Voilà merci encore, j'ai plus qu'à me casser la tête pour que mon Mario fasse un jolie saut :p
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      13 avril 2006 à 23:00:48

                                      Mais c'est trop facile !

                                      quand on appuie sur 'HAUT', la variable 'haut' vaut 1.(etc..)

                                      Ensuite si haut == 1 et droite == 1, on modifie en conséquence !

                                      :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 avril 2006 à 16:39:29

                                        DSL, mais je trouver pu le post :D .Donc j'ai reposté et merci encore pour la solution.
                                        Seulement, si on appuie sur flecheHaut + flechaDroite sa fonction mais si je relache la flecheDroite, logiquement le personnage (ou objet) devrait continuer a monter.
                                        Mais a ma grande surprise :o:euh: le personnage se bloque jusqua ce que je lache la flecheHaut et que je rappuie dessus.
                                        Je voufrais savoir si il y avait une possibilité de régler ce petit soucis :p .Où alors faut - il que jattende le cours de M@teo??(En espérant que se sera expliqué :D:) ).
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          14 avril 2006 à 20:58:33

                                          Essaye ça :

                                          Uint8 keys;
                                          int continuer = 1;
                                          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;
                                          }
                                          Uint8 keys = SDL_GetKeySate(NULL);
                                          if(keys[SDLK_UP])
                                          {
                                          positionMario.y--;
                                          }
                                          if(keys[SDLK_RIGHT])
                                          {
                                          positionMario.x++;
                                          }
                                          if(keys[SDLK_LEFT])
                                          {
                                          positionMario.x--;
                                          }
                                          }

                                          Normalement ça marche, mais on sait jamais...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 avril 2006 à 21:46:35

                                            Ca ne fonctionne pas, à moins qu'il manque un bout de code :-° .
                                            Il me marque ca comme erreur :subscipted value is neither array nor pointer.

                                            Merci à tous en attendant vos reponse :p
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 avril 2006 à 22:54:25

                                              ah désolé voici le vrai code:

                                              Uint8 *keys;
                                              int continuer = 1;
                                              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;
                                              }
                                              keys = SDL_GetKeyState(NULL);
                                              if(keys[SDLK_UP])
                                              {
                                              positionMario.y--;
                                              }
                                              if(keys[SDLK_RIGHT])
                                              {
                                              positionMario.x++;
                                              }
                                              if(keys[SDLK_LEFT])
                                              {
                                              positionMario.x--;
                                              }
                                              }

                                              j'avais oublier de dire que key est un pointeur.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                14 avril 2006 à 23:04:34

                                                voila sa c mon code :

                                                #include <stdlib.h>
                                                #include <stdio.h>
                                                #include <SDL/SDL.h>
                                                #include <SDL/SDL_image.h> /* Inclusion du header de SDL_image */

                                                void pause();

                                                int main(int argc, char *argv[])
                                                {
                                                    SDL_Surface *ecran = NULL, *imageDeFond = NULL, *zozor = NULL;
                                                    SDL_Rect positionFond, positionZozor;
                                                    SDL_Event event;
                                                    int continuer = 1, flechehaut = 0, flechedroite = 0, flechegauche = 0, flechebas = 0;

                                                    positionFond.x = 0;
                                                    positionFond.y = 0;
                                                    positionZozor.x = 500;
                                                    positionZozor.y = 260;

                                                    SDL_Init(SDL_INIT_VIDEO);

                                                    ecran = SDL_SetVideoMode(640, 429, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                                                    SDL_WM_SetCaption("Chargement d'images en SDL", NULL);

                                                    SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
                                                    imageDeFond = IMG_Load("fond.bmp");
                                                    zozor = IMG_Load("zozor.png");

                                                    SDL_EnableKeyRepeat(10, 10);

                                                    Uint8 *keys;

                                                   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;
                                                }
                                                Uint8 *keys = SDL_GetKeySate(NULL);
                                                if(keys[SDLK_UP])
                                                {
                                                positionZozor.y--;
                                                }
                                                if(keys[SDLK_RIGHT])
                                                {
                                                positionZozor.x++;
                                                }
                                                if(keys[SDLK_LEFT])
                                                {
                                                positionZozor.x--;
                                                }
                                                }


                                                        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                                                        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);


                                                        SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                                                        SDL_Flip(ecran); /* On met à jour l'affichage */
                                                    }



                                                    SDL_FreeSurface(imageDeFond);
                                                    SDL_FreeSurface(zozor);
                                                    SDL_Quit();

                                                    return EXIT_SUCCESS;
                                                }


                                                Avant ke je rajoute le morceau de code que tu m'as donné il fonctionné :p .
                                                Maintenant il compile pas a partir de SDL_FreeSurface, et la je comprend pas :o .

                                                Voici les erreurs qu'il me dit :

                                                Switching to target: default
                                                Compiling: main.c
                                                main.c: In function `SDL_main':
                                                main.c:51: warning: initialization makes pointer from integer without a cast
                                                main.c: At top level:
                                                main.c:79: error: conflicting types for 'SDL_Quit'
                                                D:/Program Files/CodeBlocks/bin/../lib/gcc/mingw32/3.4.4/../../../../mingw32/include/SDL/SDL.h:89: error: previous declaration of 'SDL_Quit' was here
                                                main.c:79: error: conflicting types for 'SDL_Quit'
                                                D:/Program Files/CodeBlocks/bin/../lib/gcc/mingw32/3.4.4/../../../../mingw32/include/SDL/SDL.h:89: error: previous declaration of 'SDL_Quit' was here
                                                main.c:79: warning: data definition has no type or storage class
                                                main.c:81: error: syntax error before "return"
                                                Process terminated with status 1 (0 minutes, 0 seconds)

                                                Voila quoi dire de plus a part :colere::colere: toujours des problèmes mdr (mais c'est eux qui nous rende meilleur :-° )
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 avril 2006 à 23:27:19

                                                  voici le code valide:

                                                  #include <stdlib.h>
                                                  #include <stdio.h>
                                                  #include <SDL/SDL.h>
                                                  #include <SDL/SDL_image.h> /* Inclusion du header de SDL_image */

                                                  void pause();

                                                  int main(int argc, char *argv[])
                                                  {
                                                      SDL_Surface *ecran = NULL, *imageDeFond = NULL, *zozor = NULL;
                                                      SDL_Rect positionFond, positionZozor;
                                                      SDL_Event event;
                                                      int continuer = 1, flechehaut = 0, flechedroite = 0, flechegauche = 0, flechebas = 0;

                                                      positionFond.x = 0;
                                                      positionFond.y = 0;
                                                      positionZozor.x = 500;
                                                      positionZozor.y = 260;

                                                      SDL_Init(SDL_INIT_VIDEO);

                                                      ecran = SDL_SetVideoMode(640, 429, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
                                                      SDL_WM_SetCaption("Chargement d'images en SDL", NULL);

                                                      SDL_WM_SetIcon(IMG_Load("sdl_icone.bmp"), NULL);
                                                      imageDeFond = IMG_Load("fond.bmp");
                                                      zozor = IMG_Load("zozor.bmp");
                                                     
                                                      SDL_SetColorKey(zozor,SDL_SRCCOLORKEY,0x0000FF);

                                                      SDL_EnableKeyRepeat(10, 10);

                                                      Uint8 *keys = NULL;

                                                     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;
                                                  }
                                                  (Uint8*)keys = SDL_GetKeyState(NULL);
                                                  if(keys[SDLK_UP])
                                                  {
                                                  positionZozor.y--;
                                                  }
                                                  if(keys[SDLK_RIGHT])
                                                  {
                                                  positionZozor.x++;
                                                  }
                                                  if(keys[SDLK_LEFT])
                                                  {
                                                  positionZozor.x--;
                                                  }
                                                  if(keys[SDLK_DOWN])
                                                  {
                                                                     positionZozor.y++;
                                                  }



                                                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                                                          SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);


                                                          SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                                                          SDL_Flip(ecran); /* On met à jour l'affichage */
                                                      }



                                                      SDL_FreeSurface(imageDeFond);
                                                      SDL_FreeSurface(zozor);
                                                      SDL_Quit();

                                                      return EXIT_SUCCESS;
                                                  }



                                                  c'était pas "Uint8 *keys = SDL_GetKeyState(NULL)", mais "keys = SDL_GetKeyState(NULL)". :-°
                                                  De plus, tu avais mis une acolade en trop, ce qui fait que la fin de ton code ne faisais plus parti de la fonction main.
                                                  De plus, c'est pas SDL_GetKeySate, mais SDL_GetKeyState().


                                                  Il marche, ce code, j'en metrai ma main au feu(en tout cas il marche chez moi. :p

                                                  P.S:
                                                  j'ai rajouter la transparence color key :) .
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 avril 2006 à 23:47:16

                                                    voila merci la fenetre saffiche mais po Zozor (le pauvre il est passer ou :(:(:D ).Je ne comprend pas pourkoi?? ET encore merci.
                                                    Peux-tu m'aider pour la suite ??

                                                    EDIT: les faute que tu as trouvées sont de ta faute :p:p:-°:p:p car g fais que un copié collé tu code que tu m'as donné :D .
                                                    A part l'incollade que j'avais oublier d'enlever (qu'est-ce que je suis bête non??).
                                                    Merci encore
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      14 avril 2006 à 23:49:16

                                                      c'est zozor.bmp, pas zozor.png, j'ai éditer le dernier post ^^ .
                                                      sinon désoler des erreurs que j'ai faites en te donnant le code.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        14 avril 2006 à 23:51:54

                                                        Je te remercie vraiment rapide et éfficace te vont très bien :D:D;) .
                                                        Pour l'extension je lavait dit : "je peut etre bête hein??"
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          14 avril 2006 à 23:55:54

                                                          Citation : krcarbokiller


                                                          je peut etre bête hein??


                                                          Tu n'est pas le seul a pouvoir etre bête :lol: .

                                                          Je me suis bien planter le coup du SDL_GetKeyState().
                                                          je vais éditer mes messages.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            15 avril 2006 à 0:01:43

                                                            J'ai fais une demande d'amis si ca te dérange pas ??? :p
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Comment gérer 2 événement 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