Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Problème avec le clavier

comme si les touches se répétaient....

Sujet résolu
Anonyme
    29 avril 2006 à 19:03:16

    Bonjour.

    J'ai un problème avec la gestion des touches du clavier...
    Voilà j'ai un menu (menu2), sur lequel peut se déplacer un curseur (curseur) à l'aide des touches Haut et Bas du clavier...

    Seulement, j'ai beau appuyer un tout petit peu, le curseur se déplace toujours de plusieurs positons à la fois, alors que je n'ai pas activé la répétition des touches avec SDL_EnableKeyRepeat();...

    Voici le code:

    #include <SDL/SDL.h>


    ////////////MACROS (pour simplifier le codage des events)////////////

    #define ECHAPE SDLK_ESCAPE
    #define ENTREE SDLK_RETURN
    #define HAUT SDLK_UP
    #define BAS SDLK_DOWN
    #define DROITE SDLK_RIGHT
    #define GAUCHE SDLK_LEFT

    #define TEMPS_MENU 1000

    ////////////INITIALISATION DES TAMPONS//////////

    SDL_Surface* screen;
    SDL_Surface* menu1;
    SDL_Surface* message_clignotant;
    SDL_Surface* menu2;
    SDL_Surface* curseur;

    ////////////INITIALISATION DES EVENEMENTS//////////

    SDL_Event event;

    ///////////CREATION DES FONCTIONS NECESSAIRES AU PROGRAMME/////////////

    SDL_Rect Rect(int x,int y,int w=0,int h=0) //pour faire des rectangles
    {
            SDL_Rect r;
            r.x=x;
            r.y=y;
            r.w=w;
            r.h=h;
            return r;
    }   

    SDL_Surface* ChargeBMP(char* fichier,int vram=1)  //Pour charger un bitmap
    {
       SDL_Surface* f = SDL_LoadBMP(fichier);       
       SDL_Surface* r=NULL;
       if (vram)
               r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
       if (r==NULL) vram=0;
       if (!vram)
               r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
       SDL_Rect R=Rect(0,0,f->w,f->h);
       SDL_BlitSurface(f,NULL,r,&R);   
       SDL_FreeSurface(f);     
       return r;
    }   

    void init_SDL() //initialisation de SDL
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetIcon(SDL_LoadBMP("Graphismes/icone.bmp"), NULL);
        screen = SDL_SetVideoMode(600, 500, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
        SDL_ShowCursor(0); //on enlève le curseur
        SDL_WM_SetCaption("Pong", NULL); //titre
    }

    void quit_SDL() //pour quitter
    {
        SDL_ShowCursor(1);
        SDL_Quit();
    }

    //Appui des touches
    char intern_key[400];

    void UpdateKeys()
    {
        while(SDL_PollEvent(&event))
        {
            switch (event.type)
            {
               
                    case SDL_KEYDOWN:
                    intern_key[event.key.keysym.sym]=1;
                    break;
                   
                    case SDL_KEYUP:
                    intern_key[event.key.keysym.sym]=0;
                    break;
            }
        }
    }   
           
    int Touche(int sdlcode)
    {
        int retour = intern_key[sdlcode];
        return retour;
    }





    ///////////CORPS DU PROGRAMME////////////////

    int main(int argc, char** argv)
    {
        init_SDL(); //Initialisation de SDL   
           
        SDL_Rect fenetre_entiere = Rect(0, 0);
        SDL_Rect pos_message_clignotant = Rect(60, 360);
        SDL_Rect pos_curseur = Rect(92, 73);
       
        menu1 = ChargeBMP("Graphismes/menus/menu1.bmp", 0);
        message_clignotant = ChargeBMP("Graphismes/menus/message_clignotant.bmp");
        curseur = ChargeBMP("Graphismes/autres_images/curseur.bmp");
       
       
        bool direct_m2 = false;
       
        int attente;
        int activer_menu=-1;
        int activer_attente=1;
        int PositionCurseur = 1;
       
        while (!Touche(ECHAPE)) //tant qu'on appuie pas sur echape
        {
            UpdateKeys(); //Rafraichissement des events
           
            if (direct_m2 == true) goto menu2; //si la variable vaut true on passe direct au deuxième menu
           
           
           //Si l'attente est activer, on la met en place, et on la desactive
            if(activer_attente==1)
            {
                attente= SDL_GetTicks() + TEMPS_MENU;
                activer_attente=0;
            }
           
            //Si l'attente est passée, on inverse activer_menu et on active l'attente pour le prochain tour
            if( SDL_GetTicks() > attente )
            {
                activer_menu = -activer_menu;   
                activer_attente=1;
            }   
           
            //Si activer_menu=-1 on affiche image de fond + menu
            if(activer_menu==-1)
            {
                SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);           
                SDL_BlitSurface(message_clignotant, NULL, screen, &pos_message_clignotant);
            }
           
            //Si activer_menu=1 on affiche que l'image de fond
            if(activer_menu==1)
            {
                SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);
            } 
                   
            if (Touche(ENTREE)) //si on appuie sur entree
            {
               
                SDL_FreeSurface(screen); //libération de l'écran
                direct_m2 = true; //pour dire de passer direct au deuxième menu après la boucle
               
                menu2:
                menu2 = ChargeBMP("Graphismes/menus/menu2.bmp", 0);
               
                while (1) //CE QUI NOUS INTERESSE, C'EST A PARTIR D'ICI
                {
                    if (Touche(ECHAPE)) return 0;
                   
                             
                    SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere); //on colle l'image sur l'écran
                   
                    SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);                 
                   
                    if (PositionCurseur == 1)
                    {
                        SDL_FreeSurface(screen);
                        pos_curseur = Rect(92, 73);
                        SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(BAS)) PositionCurseur = 2;
                        if (Touche(HAUT)) PositionCurseur = 3;
                        SDL_Flip(screen);
                        goto cible;
                    }
                   
                    if (PositionCurseur == 2)
                    {
                        pos_curseur = Rect(69, 230);
                        SDL_FreeSurface(screen);
                        SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(BAS)) PositionCurseur = 3;
                        if (Touche(HAUT)) PositionCurseur = 1;
                        SDL_Flip(screen);
                        goto cible;
                    }
                   
                    if (PositionCurseur == 3)
                    {
                        pos_curseur = Rect(107, 384);
                        SDL_FreeSurface(screen);
                        SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(HAUT)) PositionCurseur = 2;
                        if (Touche(BAS)) PositionCurseur = 1;
                        SDL_Flip(screen);
                        goto cible;
                    }       
                   
                    SDL_Flip(screen);
                    cible:
                    UpdateKeys();
                   
                }   
            }   
           
           
            SDL_FreeSurface(screen);
           
            SDL_Flip(screen); //Rafraîchissement de screen           
        }
       
       
        quit_SDL(); // On quitte SDL
        return 0;   
    }   
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      29 avril 2006 à 20:20:27

      Eh, ben, soit tu active SDL_Enable key repeat avec des grands laps de temps, soit tu utilise la fonction SDL_GetTicks, qui renvoie le nombre de milisecondes écoulées depuis le début du programme : http://vally8.free.fr/coinprog/sdl/tut4/timer.php
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        29 avril 2006 à 20:42:20

        J'ai rajouté cette ligne:
        SDL_EnableKeyRepeat(100000, 100000);
        Pourtant l'effet est toujours le même :(
        Je vais donc essayer avec SDL_GetTicks()...

        Non, j'ai finalement mis SDL_Delay(35);, et ça marche, et plus simplement...

        Merci ^^
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          29 avril 2006 à 20:47:39

          SDL Delay bloque tout ton programme pendant un certain temps, sa te gènera surement si tu dois faire des animations, ....

          Utilise SD_GetTicks ainsi :


          if (SDL_GetTicks() >= ticks_event+500)
          {
               //Code a effecture tous les X milisecondes
               
               ticks_event = SDL_GetTicks();
          }


          Remplace le 500 par le nombre que tu veux...
          • Partager sur Facebook
          • Partager sur Twitter
            30 avril 2006 à 13:30:32

            Indique que ton problème est réglez ...
            C'est simple t'as juste à cliquez en bas de la page sur "Mon problème est résolus" car si tout le monde fais comme toi c'est un forum vouer à l'echec...
            ^^
            • Partager sur Facebook
            • Partager sur Twitter

            [SDL]Problème avec le clavier

            × 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