Partage
  • Partager sur Facebook
  • Partager sur Twitter

en SDL : les touches enfoncées

(quand on appuie sur deux touches)

    25 juillet 2006 à 11:11:42

    Bonjour !
    voila mon probleme : pour un jeu, on a parfois besoin de presser deux touches à la fois malheureusement, avec event.key.keysym.sym sa ne marche pas (à mon avis il ne retient qu'un seul touche enfoncé) .
    Donc voila ma question : comment faire pour que SDL retienne 2 (ou +) touche enfoncé ?
    • Partager sur Facebook
    • Partager sur Twitter
      25 juillet 2006 à 11:29:43

      Présise ce que tu veux faire...
      • Partager sur Facebook
      • Partager sur Twitter
        25 juillet 2006 à 11:52:58

        alors je prend un exemple : imaginons que l'on créer un jeu avec deux personnage (star wars tant qu'on y est) et que c'est deux personnage doivent se battre . c'est en mode multijouer (donc 2 personnes y jouent) . Ce que je voudrais savoir c'est commment faire pour que quand le joueur1 appuie sue une touche en même temps que le joueur 2 les 2 personnages bouge . Je n'pense pas que faire ce code(par exemple) :

        if(event.key.keysym.sym == SDLK_a)positionpersonnagejoueur1.y--;
         if(event.key.keysym.sym == SDLK_RIGHT)positionpersonnagejoueur1.y++;


        marcherait (en tous cas j'ai essayé et ça ne marche pas .)

        j'ai regardé certain code et j'ai vui une instruction du genre : keystate[SDLK_a] (c'est peut être la solution à ma question mais je ne sait pas comment m'en servir .)

        (en tous cas j'ai pas envies de me casser la tête pour vos comment il font dans 24HU lol)
        • Partager sur Facebook
        • Partager sur Twitter
          25 juillet 2006 à 12:26:18

          Salut,
          Je ne peux te parler de keystate, vu que je ne l'ai jamais utilisé, mais il y a une autre méthode courament utilisée.

          Tout d'abord, il convient de comprendre ( ce n'est apparement pas le cas ) qu'un évènement SDL_KEYDOWN est généré quand tu presse la touche, et non quand elle est enfoncée.
          Pour connaître l'état d'une touche ( enfoncée ou non ) on utilise donc des variables booléennes ( autant que de touches à vérifier ) qui sont mises à 1 lors d'un évènement SDL_KEYDOWN et à 0 lors d'un évènement SDL_KEYUP : ainsi, quand la variable vaut 1, la touche est enfoncée, sinon elle ne l'est pas.

          Attention : il ne faut pas activer SDL_EnableKeyRepeat.
          • Partager sur Facebook
          • Partager sur Twitter
            25 juillet 2006 à 16:57:23

            heu non . tu n'as pas compris ce que je voulais dire (en plus tu me prend pour un zéro :p ). Quand on appuie sur la touche escape et enter (par exemple) quelle est la valeur de event.key.keysym.sym ? surement la dernière touche enfoncé (il y a forcément un dixième d'écart) .

            j'ai une autre idée d'exemple tient
            imaginons un bonhomme au millieu de l'écran, et il peut se balader partout . (prenons zozor comme bonhomme comme dans les cours )
            je met le code tant que j'y suis :
            #include <stdlib.h>
            #include <stdio.h>
            #include <SDL/SDL.h>

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

                SDL_Init(SDL_INIT_VIDEO);

                ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                /* Chargement de Zozor */
                zozor = SDL_LoadBMP("zozor.bmp");
                SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                /* On centre Zozor à l'écran */
                positionZozor.x = ecran->w / 2 - zozor->w / 2;
                positionZozor.y = ecran->h / 2 - zozor->h / 2;
            SDL_EnableKeyRepeat(10, 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_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;
                    }

                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                    SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                    SDL_Flip(ecran); /* On met à jour l'affichage */
                }

                SDL_FreeSurface(zozor);
                SDL_Quit();

                return EXIT_SUCCESS;
            }


            trouve moi le moyen que quand on appuie sur la touche SDLK_UP et SDLK_RIGHT zozor aille en diagonale montante (en haut à droite).

            voila tous le problème de ma question . (peut être que l'on pourait stoker event.key.keysym.sym dans une variable ?)
            • Partager sur Facebook
            • Partager sur Twitter
              25 juillet 2006 à 17:22:23

              hum hum essaye de comprendre ce que l'on t'explique...

              tu créé une variable "toucheDroiteEnfoncee" une autre "toucheGaucheEnfoncee".. etc qui prennent 1 (vrai) si elles le sont ou 0 si elles ne le sont pas

              ensuite lorsque que l'utilisateur ENFONCE la touche (ça dur même pas un millième de seconde) c'est a dire dans le switch de l'évenement tu mets

              case SDLK_DOWN:
              toucheHautEnfoncee = 1 ;
              break;

              ensuite, APRES le switch de l'évenement tu fait

              if( toucheHautEnfoncee == 1 )
              positionZozor.y--;
              if( toucheBasEnfoncee == 1 )
              positionZozor.x++;

              etc :)
              • Partager sur Facebook
              • Partager sur Twitter
                25 juillet 2006 à 17:43:17

                Oui, essaye ce que tu dis !
                (ça marche mais...)

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

                int main(int argc, char *argv[])
                {
                    SDL_Surface *ecran = NULL, *zozor = NULL;
                    SDL_Rect positionZozor;
                    SDL_Event event;
                    int continuer = 1,i=0, touche[4]; //touche[0] pour SDLK_UP, touche[1] pour SDLK_RIGHT, touche[2] pour SDLK_DOWN, touche[3] pour SDLK_LEFT,

                    SDL_Init(SDL_INIT_VIDEO);

                    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                    SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                    /* Chargement de Zozor */
                    zozor = SDL_LoadBMP("zozor.bmp");
                    SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                    /* On centre Zozor à l'écran */
                    positionZozor.x = ecran->w / 2 - zozor->w / 2;
                    positionZozor.y = ecran->h / 2 - zozor->h / 2;

                    while (continuer)
                    {
                        SDL_PollEvent(&event);
                        switch(event.type)
                        {
                            case SDL_QUIT:
                                continuer = 0;
                            break;
                            case SDL_KEYDOWN:
                                switch(event.key.keysym.sym)
                                {
                                    case SDLK_UP: // Flèche haut
                                        touche[0] = 1;
                                        break;
                                    case SDLK_RIGHT: // Flèche bas
                                        touche[1] = 1;
                                    break;
                                    case SDLK_DOWN: // Flèche droite
                                        touche[2]=1;
                                    break;
                                    case SDLK_LEFT: // Flèche gauche
                                        touche[3]=1;
                                    break;
                                }
                            break;
                            case SDL_KEYUP:
                                for(i=0;i<4;i++)
                                    touche[i] = 0;
                            break;
                        }

                        if(touche[0])positionZozor.y--;
                        if(touche[1])positionZozor.x++;
                        if(touche[2])positionZozor.y++;
                        if(touche[3])positionZozor.x--;

                        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                        SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                        SDL_Flip(ecran); /* On met à jour l'affichage */
                    }

                    SDL_FreeSurface(zozor);
                    SDL_Quit();

                    return EXIT_SUCCESS;
                }


                appuie sur SDLK_UP, puis sur SDLK_RIGHT et enfin relache SDLK_RIGHT .
                zozor s'arrête tous seul ! comment ce fait il ? (réfléchie et tu trouveras ...)

                Mais Laissez tomber ! j'ai cherché dans les codes des autres et j'ai finalement trouvé la solution !

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

                int main(int argc, char *argv[])
                {
                    SDL_Surface *ecran = NULL, *zozor = NULL;
                    SDL_Rect positionZozor;
                    SDL_Event event;
                    int continuer = 1;
                 Uint8 *keystate = SDL_GetKeyState(NULL);
                    SDL_Init(SDL_INIT_VIDEO);

                    ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                    SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                    /* Chargement de Zozor */
                    zozor = SDL_LoadBMP("zozor.bmp");
                    SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                    /* On centre Zozor à l'écran */
                    positionZozor.x = ecran->w / 2 - zozor->w / 2;
                    positionZozor.y = ecran->h / 2 - zozor->h / 2;

                    while (continuer)
                    {
                        SDL_PollEvent(&event);
                        switch(event.type)
                        {
                            case SDL_QUIT:
                                continuer = 0;
                            break;

                        }

                                if(keystate[SDLK_UP]) positionZozor.y--;
                                if(keystate[SDLK_RIGHT]) positionZozor.x++;
                                if(keystate[SDLK_LEFT]) positionZozor.x--;
                                if(keystate[SDLK_DOWN]) positionZozor.y++;

                        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                        SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                        SDL_Flip(ecran); /* On met à jour l'affichage */
                    }

                    SDL_FreeSurface(zozor);
                    SDL_Quit();

                    return EXIT_SUCCESS;
                }


                et voila le travail ! j'ai mis le main dans le cambui mais j'y suis arrivé (plus facilement que vos variable toucheenfoncedroite prend 1 alors blablabla blablabla blablabla...) et en plus ça pourras vous servir si vous programmer !
                • Partager sur Facebook
                • Partager sur Twitter

                en SDL : les touches enfoncées

                × 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