Partage
  • Partager sur Facebook
  • Partager sur Twitter

2 touches en même temps

Sujet résolu
    15 avril 2006 à 21:33:11

    Salut,
    Je veux arriver a mettre dans mon jeu ma voiture de travers quand on apuie sur la touche du bas et celle de droite.
    J'ai essayer comme sa :


    case SDL_KEYDOWN :
                         switch (event.key.keysym.sym) {
                               
                                case SDLK_RIGHT :
                                     
                                     posvoiture.x += 5;
                                     
                                     break;
                               
                                case SDLK_LEFT :
                               
                                posvoiture.x -= 5;
                               
                                     break;
                                     
                               
                                case SDLK_UP :
                               
                               posvoiture.y -= 5;
                               
                               break;
                             
                               case SDLK_DOWN :
                                    posvoiture.y += 5;
                                    break;
                                   
                                     if (SDLK_DOWN && SDLK_RIGHT) {
                                    voiture = IMG_Load(".//Image//Voiture//voitureV1.gif");
                                    posvoiture.y +=5;
                                    posvoiture.x +=5;
                                    }
                                   
                                }


    Et sa fait rien.
    C'est peut - etre impossible lol.

    Merci d'avance
    +
    • Partager sur Facebook
    • Partager sur Twitter
      15 avril 2006 à 21:37:42

      je ne mit connais pas tro mais ferme ton switch avant ton if :euh: apres je c pas si c'est bon jespere tavoir aider
      • Partager sur Facebook
      • Partager sur Twitter
        15 avril 2006 à 21:41:43

        J'ai essayer comme sa aussi, sa marche un peu mieu.
        L'image change et il va de travers mais il va faire sa si j'appuie sur la touche droit ou bas pas les 2.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 avril 2006 à 21:42:25

          http://perso.numericable.fr/~fvirtman/info/tuto/2_1_04_events.cpp

          regarde le système d'evenement avec le tableau, ensuite tu vérifie si les deux cases sont "ok"
          • Partager sur Facebook
          • Partager sur Twitter
            15 avril 2006 à 21:59:28

            sa serait pas plutot
            if(event.key.keysym.sym==SDLK_DOWN && event.key.keysym.sym==SDLK_RIGHT)
            {
                  ...
            }

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 avril 2006 à 22:09:55

              Ca ne marche pas car la fonction waitevent/pollevent ne retourne qu'un seul évenement a la fois, il faut donc faire un tableau (de 400 int) et activer chaque casse dès qu'elle est pressée, la désactiver quand elle est relachée , on accède a un élément du tableau ainsi : tableau[SDLK_DOWN]
              • Partager sur Facebook
              • Partager sur Twitter
                15 avril 2006 à 22:14:05

                Ok, je vais voir si je m'en sors
                • Partager sur Facebook
                • Partager sur Twitter
                  15 avril 2006 à 22:40:20

                  Beaucoup plus simple

                  case SDLK_DOWN
                  bas = 1;
                  case SDLK_RIGHT
                  droit = 1;

                  if(droit && bas)
                  positionMachin.y +=3
                  positionMachin.x +=3


                  Ce qui ammêne à un déplacement en diagonale au final ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 avril 2006 à 22:43:45

                    Salut , alors je croit tu trouveras ce que tu cherches ici :p <lien url="http://www.siteduzero.com/forum-83-32594-p1-comment-gerer-2-evenement-en-meme-temps.html"></lien>
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 avril 2006 à 22:58:06

                      Quand j'ai terminer les cours pour afficher des images, j'ai voulu me lancer dans les events c'est à dire avant que M@teo ne commence à l'écrire. N'ayant pas trouvé de tuto a mon gout, j'ai trouvé un expemple, utilisé la fonction recherche/remplace de code block pour mètre les variables en francais, j'ai mis un maximum de commentaires et suprimé des parties pour voir ce qui était indispensable.

                      je me suis familiarisé avec le resultat et ma methode ressembleà ca:
                      Uint8 *touche;
                      while(!done)
                          {


                      while(SDL_PollEvent(&event))
                              {
                                  switch(event.type)
                                  {
                                      case SDL_QUIT:
                                      done = 1;
                                      break;
                                  }
                              }


                                      if(touche[SDLK_a])
                                      {
                                       }
                      }


                                     


                      Je ne peu pas affirme que cette methode est parfaitement fiable mais je n'ai eu aucun problème avec.
                      Pour experimenter les events je l'ai utilisé pour déplace un personnage et dans ton cas en mettant un SDLK_UP et un SDLK_RIGHT dans 2 if disting faisant chacun aller dans une direction, suffira si tu apuis sur les 2 touches en même temps à deplacer la voiture en diagonal.

                      Le code bout de code
                      if (touche[SDLK_UP] && touche[SDLK_RIGHT] )
                      {
                      //tu définit l'image d'une voiture en diagonal ici
                      }

                      permet de chager l'image d'une voiture en diagonal lors de la pression des 2 touches.Bien sur il faut ensuite redefinir l'image dans SDLK_UP pour que la voiture soit oriente dans la bonne direction si elle reprend une trajectoire droite.

                      je suis qu'un débutant alors je sais pas si cette methode est correcte mais elle marche.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 avril 2006 à 23:17:30

                        Merci beaucoup je vais essayer et je vous dis quoi MERCI +

                        EDIT :

                        Bon j'ai testé plus ou moins toute les solutions. Et sa marche ... presque :p
                        Voila ma boucle :

                        while (continuer) {
                                 
                                    SDL_WaitEvent(&event);
                                   
                                   switch (event.type) {
                                         
                                       
                                        case SDL_QUIT :
                                        continuer = 0;
                                        break;
                                         
                                        case SDL_KEYDOWN :
                                             
                                             switch (event.key.keysym.sym) {
                                                   
                                                         case SDLK_RIGHT :
                                                         droit = 1;
                                                         break;
                                                   
                                                        case SDLK_LEFT :
                                                        gauche = 1;
                                                        break;
                                                         
                                                   
                                                       case SDLK_UP :
                                                       haut = 1;
                                                       break;
                                                 
                                                        case SDLK_DOWN :
                                                        bas = 1;
                                                        break;
                                                       
                                                        }
                                                    break;
                                                   
                                                    case SDL_KEYUP :
                                                            haut = 0;                                     
                                                            bas = 0;
                                                            gauche = 0;
                                                            droit = 0;
                                                        break;
                                 
                                        }
                                        if(haut)
                                               posvoiture.y -= 5;
                                        /* Le probleme est là !!! Enfaite j'ai un problème avec l'image : ma voiture ne s'affiche pas */     
                        if(bas) {
                                                 posvoiture.y += 5;
                                                 if (droit)
                                                   // Cette ligne qui va pas :
                                                 voiture = IMG_Load(".Image\\Voiture\\voitureV1.gif");
                                                 posvoiture.x += 5;
                                                 }
                                        if(gauche)
                                                posvoiture.x -= 5;
                                        if(droit)
                                               posvoiture.x += 5;
                                     
                                     
                                       if (m==2) {
                                                   map2();
                                                  }
                                       if (m==1)  {
                                                  map1();
                                                  }
                                       if (m==0)  {
                                                  map0();
                                                  }
                                       route();
                                       
                                              finMap();
                                               
                                          SDL_BlitSurface(voiture, NULL, ecran, &posvoiture);             
                                        SDL_Flip(ecran);
                                         }



                        Pourquoi sa me fait sa ?
                        Il faut que change de technique ?

                        A++(bonne nuit peut-etre lloll)
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          16 avril 2006 à 9:13:38

                          Vérifie ta fonction IMG_Load, et (je crois que ) l'erreur vient du fait que tu a placé un point dans le nom du fichier : appelle le comme ceci :
                          IMG_Load("Images\\Voiture\\VoitureV1.bmp");
                          ou
                          IMG_Load("./Images/Voiture/VoitureV1.bmp");
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 avril 2006 à 11:35:09

                            Sa ne va toujours pas sinon j'ai essayé de faire comme sa :

                            J'ai mis voitureV1 en BMP
                            if(bas) {
                                                     posvoiture.y += 5;
                                                     if (droit)
                                                     voiture = SDL_LoadBMP(".Image\\Voiture\\voitureV1.bmp");
                                SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                     posvoiture.x += 5;


                            Cette fois je vois la voitureV1 mais dès le début et elle bouge toute seul LOL.

                            Je vais voir si ca va mieux avec Unit8 *...............
                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 avril 2006 à 11:37:07

                              Et aussi, au lieu de :
                              case SDL_KEYUP :
                                      haut = 0;                                     
                                      bas = 0;
                                      gauche = 0;
                                      droit = 0;
                                      break;


                              Met plutôt :

                              case SDL_UP :
                                 switch (event.key.keysym.sym)
                                 {
                                 case SDLK_RIGHT :
                                        droit = 0;
                                        break;
                                                         
                                 case SDLK_LEFT :
                                        gauche = 0;
                                        break;
                                                                           
                                 case SDLK_UP :
                                        haut = 0;
                                        break;
                                                       
                                 case SDLK_DOWN :
                                        bas = 0;
                                        break;
                                  }


                              Comme ça, si tu laches la touche haut, il n'y aura que haut qui sera mis à 0.
                              Par contre la méthode par keymap (le grand tableau de touches) est beaucoup plus pratique, et elle est réutilisable pour n'importe quel application.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                16 avril 2006 à 11:45:51

                                J'ai fait une classe la dessus, je peut te l'envoyer si tu te débrouille avec les classe (c++ pur)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 avril 2006 à 11:48:33

                                  OK mais sa n'arrange pas le problème de mon image.
                                  mais je vais essayer comme tu l'a dit keymap :

                                  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
                                  Anonyme
                                    16 avril 2006 à 11:51:34

                                    Voila ma classe :

                                    evenements.cpp

                                    #include <sdl/sdl.h>

                                    //Variables utilisées pour la fonction PositionSouris();
                                    #define POSITION_X      0
                                    #define POSITION_Y      1
                                    #define POSITION_X_REL  2
                                    #define POSITION_Y_REL  3

                                    #include "evenements.h"

                                    Evenements::Evenements()           //Constructeur
                                    {
                                        int i=0;
                                        for (i=0; i<400; i++)
                                            touche[i] = 0;
                                        xsouris = ysouris = xrelsouris = yrelsouris = 0;
                                        for (i=0; i<3; i++)
                                            bouton[i] = 0;
                                        continuer = 1;
                                    }
                                    void Evenements::MiseAJour()         //Met a jour les éléments de la classe
                                    {
                                        while (SDL_PollEvent(&event));
                                        {
                                            switch (event.type)
                                            {
                                                case SDL_QUIT :
                                                     continuer = 0;
                                                case SDL_KEYDOWN :
                                                     touche[event.key.keysym.sym] = 1;
                                                     break;
                                                case SDL_KEYUP :
                                                     touche[event.key.keysym.sym] = 0;
                                                     break;
                                                case SDL_MOUSEMOTION :
                                                     xsouris    = event.motion.x;
                                                     ysouris    = event.motion.y;
                                                     xrelsouris = event.motion.xrel;
                                                     yrelsouris = event.motion.yrel;
                                                     break;
                                                case SDL_MOUSEBUTTONDOWN :
                                                     bouton[event.button.button-1] = 1;
                                                     break;
                                                case SDL_MOUSEBUTTONUP :
                                                     bouton[event.button.button-1] = 1;
                                            }
                                        }
                                    }
                                    /*Retourne le statut de chaque touche du clavier dans le tableau passé en paramètre
                                    ATTENTION, le tableau passé en paramètre doit absolument faire 400 cases
                                    Pour accéder a une touche, il suffit de faire clavier[SDLK_RIGHT] par exemple */

                                    void Evenements::StatutTouches(int *clavier)   
                                    {
                                        int i;                                     
                                        for (i=0; i<400; i++)
                                            clavier[i] = touche[i];
                                    }   
                                    int Evenements::PositionSouris(int type)    //Retourne la position de la souris passé en paramètre(x, y, xrel, yrel)
                                    {
                                        switch (type)
                                        {
                                            case POSITION_X :
                                                 return xsouris;
                                            case POSITION_Y :
                                                 return ysouris;
                                            case POSITION_X_REL :
                                                 return xrelsouris;
                                            case POSITION_Y_REL :
                                                 return yrelsouris;
                                        }
                                    }
                                    int Evenements::Continuer()        //Retourne 0 si on a cliqué sur SDL_QUIT
                                    {
                                        return continuer;
                                    }
                                    void Evenements::Initialiser()
                                    {
                                        int i;
                                        for (i=0; i<3; i++)
                                            bouton[i] = 0;
                                    }




                                    evenements.h


                                    #ifndef EVENEMENT_H
                                    #define EVENEMENT_H

                                    #include <sdl/sdl.h>

                                    class Evenements
                                    {
                                             
                                        private :
                                                char touche[400];              //Les touches appuyées
                                                int xsouris, ysouris;           //La position de la souris
                                                int xrelsouris, yrelsouris;      //Le déplacement de la souris
                                                int continuer;                      //Pour l'evenement SDL_QUIT
                                                int bouton[3];                   //Les boutons de la souris
                                               
                                                SDL_Event event;                 
                                        public :
                                               Evenements();
                                               void MiseAJour();
                                               void StatutTouches(int*);
                                               int PositionSouris(int);
                                               int Continuer();
                                               void Initialiser();
                                               

                                    };
                                    #endif


                                    J'ai plus ou moins commenté, essaye de te débrouiller comme ca
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      16 avril 2006 à 12:13:35

                                      Je connais pas du tout le C++ lol DSL

                                      EDIT :

                                      C'est bon j'ai réussi (grace à Unit8 ..) voila le code :

                                      while (continuer) {
                                           
                                      SDL_PollEvent(&event);

                                      switch(event.type)
                                      {
                                      case SDL_QUIT:
                                      continuer = 0;
                                      break;
                                      }

                                      Uint8 *keys = SDL_GetKeyState(NULL);
                                      if(keys[SDLK_UP])
                                      {
                                             voiture = IMG_Load(".\\Image\\Voiture\\voitureH.gif");   
                                             SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));     
                                             posvoiture.y--;
                                      }
                                      if(keys[SDLK_RIGHT])
                                      {
                                                          voiture = SDL_LoadBMP(".\\Image\\Voiture\\voitureD.bmp");
                                                          SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                      posvoiture.x++;
                                      }
                                      if(keys[SDLK_LEFT])
                                      {
                                                         voiture = SDL_LoadBMP(".\\Image\\Voiture\\voitureG.bmp");
                                                         SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                      posvoiture.x--;
                                      }
                                      if(keys[SDLK_DOWN])
                                      {
                                                         voiture = IMG_Load(".\\Image\\Voiture\\voitureB.gif");
                                                         SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                         posvoiture.y++;
                                      }
                                      if(keys[SDLK_DOWN] && keys[SDLK_RIGHT])
                                      {
                                                         voiture = SDL_LoadBMP(".\\Image\\Voiture\\voitureV1.bmp");
                                                         SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                         posvoiture.x++;
                                                         posvoiture.y++;
                                      }

                                      if(keys[SDLK_LEFT] && keys[SDLK_DOWN]) {
                                                         voiture = IMG_Load(".\\Image\\Voiture\\voitureV2.gif");
                                                         SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                         posvoiture.x--;
                                                         posvoiture.y++;
                                                         }


                                       if(keys[SDLK_LEFT] && keys[SDLK_UP])  {
                                                          voiture = IMG_Load(".\\Image\\Voiture\\voitureV3.gif");
                                                          SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                          posvoiture.x--;
                                                         posvoiture.y--;
                                                          }

                                       if(keys[SDLK_RIGHT] && keys[SDLK_UP]) {
                                                           voiture = IMG_Load(".\\Image\\Voiture\\voitureV4.gif");
                                                           SDL_SetColorKey(voiture, SDL_SRCCOLORKEY, SDL_MapRGB(voiture->format, 255, 255, 255));
                                                           posvoiture.x++;
                                                         posvoiture.y--;
                                                           }



                                      C'est impécable ma voiture va dans tous les sens et l'image change


                                      MERCI BEAUCOUP POUR VOTRE AIDE
                                      </span></span>

                                      A++
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        16 avril 2006 à 12:18:07

                                        Mais tu peux voir plus ou moinsa quoi ressembles mes fonctions.
                                        Pour créer une entité de cette classe , tu met
                                        Evenements nom_de_la_variable

                                        Pour accéder a une fonction , c'est comme les tableau(tu ne peux pas accéder aux éléments privés) :
                                        nom_de_la_variable.MiseAJour()
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          16 avril 2006 à 12:23:25

                                          Avec cette classe il aurait falut comme tu a mis mettre en .cpp sa pourrait géner le reste du code si le reste du code est propre au C non ?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            16 avril 2006 à 12:49:30

                                            Non, ca ne gène en aucun cas le code, car le C++ peut faire tout ce que fait le C
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              16 avril 2006 à 13:22:52

                                              d'accord merci, je vais garder ta classe elle me servira surement
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              2 touches 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