1

Hello !
Ca fait mainteant plusieurs semaines que je n'ai dérangé personne sur ce forum avec mes soucis de codage...
Alors en voici un nouveau :
Je ne sais comment gerer des pressions de touches simultanées.
Exemple :
Comment provoquer une action lorsque "A" et "R" sont pressées en meme temps.

L'exmeple du wikipedia (http://wiki.gp2x.org/wiki/SDL_Joystick_mapping) n'explique pas comment gérer des pressions simultanées.

Quelqu'un aurait une solution ?

2

solution que j'avais faites pour un test perso.. je suis nul en C++ mais j'ai des idées smile

Lors qu'une pression sur une touche tu mets un booléen a TRUE lors du relachement tu le bascules à FALSE.. apres un simple if(a_pressed = true && b_pressed = true).....

Coté syntaxe regarde pas wink je suis issu du monde php donc la syntaxe c/c++ m'en souviens po grin
avatar
Tout probleme a sa solution
Oeil de feu

3

oeildefeu :
solution que j'avais faites pour un test perso.. je suis nul en C++ mais j'ai des idées smile

Lors qu'une pression sur une touche tu mets un booléen a TRUE lors du relachement tu le bascules à FALSE.. apres un simple if(a_pressed == true && b_pressed == true).....

Coté syntaxe regarde pas wink je suis issu du monde php donc la syntaxe c/c++ m'en souviens po grin


Tu as presque bon.
A chacun sa passion, certain aime le ballon rond, d'autre la natation, moi c'etait les jeux vidéo...
... et puis j'ai rencontré ma compagne et le monde et plus beaux en réalité qu'en virtuel désormais.
dédicace à ma douce.

4

ha merde du coup c'est comme en php grin
Et a_pressed === true marche aussi ?
En php le === vérifie que c'est le même type de données également.. vue qu'en php les variables ne sont pas typées..
avatar
Tout probleme a sa solution
Oeil de feu

5

Mon soucis, c'est que l'exemple de wiki pedia fonctione sur un "switch" et non un "if",
donc il n'y a jamais deux solution possibles.
Je recherche une sintaxe basée sur des tests "if".

6

Je suppose que tu programmes avec la lib SDL, et de ce que je me rappel, il faut aussi initialiser le joystick pour prendre en compte l'accès à plusieurs touche en même temps. Car de base le joystick est initialisé sur une seule pression. Je vais regarder si j'ai quelque chose comme ca sur mon pc.

7

Bon pour la pression de plusieurs touches au clavier ca ressemble a ça mais pas sur que ce soit pareil pour le joystick
 //bien penser à initialiser les variables haut_presse,bas_presse... a zéro au début du programme           //Obtenir les KeyStates         Uint8 *keystates = SDL_GetKeyState( NULL );         //Si Haut est pressé (la fleche)         if( keystates[ SDLK_UP ] )         {             haut_presse=1;         }         //Si Bas est pressé (la fleche)         if( keystates[ SDLK_DOWN ] )         {             bas_presse=1;         }         //Si Gauche est pressé (la fleche)         if( keystates[ SDLK_LEFT ] )         {             gauche_presse=1;         }         //Si Droite est pressé (la fleche)         if( keystates[ SDLK_RIGHT ] )         {             droite_presse=1;         }         if(haut_presse ==1 && bas_presse==1)         {             //action a faire lorsque ces deux touches sont préssées             //ne pas oublier de remettre ces deux drapeaux à 0             }             //de même si d'autre test                      

8

merci pour l'aide, mais je n'y suis toujours pas arrivé. En fait, je n'arrive pas a formuler le code de récupération des touches GP2X avec un systeme de conditions IF.
J'utilise un CASE OF pour le moment:
////////////
switch (event.type)
{
case SDL_KEYDOWN:
switch(event.key.keysym.sym)
{
case SDLK_x:toucheX=1;break;
case SDLK_y:toucheY=1;break;
case SDLK_ESCAPE:toucheESC=1;break;
case SDLK_r:toucheR=1;break;
case SDLK_l:toucheL=1;break;
case SDLK_s:toucheStart=1;break;
}
break;
case SDL_JOYBUTTONDOWN:
switch(event.jbutton.button)
{
case GP2X_BUTTON_CLICK:toucheClic=1;break;
case GP2X_BUTTON_A:toucheA=1;break;
case GP2X_BUTTON_B:toucheB=1;break;
case GP2X_BUTTON_L:toucheL=1;break;
case GP2X_BUTTON_SELECT:toucheSelect=1;break;
case GP2X_BUTTON_START:toucheStart=1;break;
}
}
///////////
Le code que tu me propose fonctionne pour les touches du clavier windows, mais comment l'adapter pour les boutons GP2X?
C'est vraiment génant pour mon projet :/
D'ailleurs je viens juste de publier la deuxieme release sur mon site:
http://www.pikilipita.com/vj

9

ben c'est le même principe avec un joystick ou un clavier, mais il faut aussi mettre ton drapeau a zéro quand tu relaches le bouton sinon ton bouton est toujours en position appuyer.

Par contre je suis pas certain qu'avec un case tu puisses recuperer pour deux boutons en meme tps, le if est plus approprié

10

Sans le break; à la fin des case, tu peux vaider plusieurs condition en même temps (normallement).

11

J'ai essayé de rediger mon code avec des IF, ca fonctionn bien pour detecter une pression sur le clavier windows, mais pas un pression sur une touche de la gp2X.
voila mon code:
/////////////

Uint8 *keystates = SDL_GetKeyState( NULL );

//Si Haut est pressé (la fleche)
if( keystates[ SDLK_RIGHT ] )
{
toucheDroite=1;
}
if( keystates[ GP2X_BUTTON_RIGHT ] )
{
toucheDroite=1;
}
////////////
le "if( keystates[ GP2X_BUTTON_RIGHT ] )" ne fonctionne pas...

12

voila le code que j'ai utilisé pour m'amuser a tester un peu le c++ sur GP2x grin
C'est pitetre pas beau mais ca marchait et j'arrivait à déplacer une image avec ca wink

int done=0;
    bool left = false;
    bool right = false;
    bool up = false;
    bool down = false;
while (!done) //tant que done est = a 0
    {
SDL_Event event;
       while (SDL_PollEvent(&event))
       {
          switch (event.type)
          {
          case SDL_KEYDOWN:                   
               switch (event.key.keysym.sym)
               {
                      case SDLK_ESCAPE:
                           // If escape is pressed, return (and thus, quit)
                           return 0;
                      case SDLK_LEFT:
                           left = true;
                           break;
                      case SDLK_RIGHT:
                           right = true;
                           break;
                      case SDLK_UP:
                           up = true;
                           break;
                      case SDLK_DOWN:
                           down = true;
                           break;
               }
        break;
        case SDL_KEYUP:                  
             switch (event.key.keysym.sym)
             {
                    case SDLK_LEFT:
                         left = false;
                         break;
                    case SDLK_RIGHT:
                         right = false;
                         break;
                    case SDLK_UP:
                         up = false;
                         break;
                    case SDLK_DOWN:
                         down = false;
                         break;
             }
        break; 
        case SDL_QUIT:
             return(0);
      }
    }
} 
avatar
Tout probleme a sa solution
Oeil de feu

13

Ca y est ! j'ai la solution !!
extrait de code:
//////////////////

if(( keystates[ SDLK_RIGHT ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_RIGHT ) )){toucheDroite=1;}
if(( keystates[ SDLK_LEFT ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_LEFT ) )){toucheGauche=1;}
if(( keystates[ SDLK_UP ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_UP ) )){toucheHaut=1;}
if(( keystates[ SDLK_DOWN ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_DOWN ) )){toucheBas=1;}
if(( keystates[ SDLK_a ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_A ) )){toucheA=1;}
if(( keystates[ SDLK_b ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_B ) )){toucheB=1;}
if(( keystates[ SDLK_x ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_X ) )){toucheX=1;}
if(( keystates[ SDLK_y ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_Y ) )){toucheY=1;}
if(( keystates[ SDLK_l ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_L ) )){toucheL=1;}
if(( keystates[ SDLK_r ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_R ) )){toucheR=1;}
if(( keystates[ SDLK_s ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_START ) )){toucheStart=1;}
if(( keystates[ SDLK_RETURN ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_SELECT ) )){toucheSelect=1;}
if(( keystates[ SDLK_c ] )||( SDL_JoystickGetButton( joy, GP2X_BUTTON_CLICK ) )){toucheClic=1;}
if( keystates[ SDLK_ESCAPE ] ){toucheESC=1;}

if (toucheStart==1){pausee=1;}


//////////////////
Mercxi a tous pour votre aide !