2016-04-20 1 views
0

Je suis en train de programmer un jeu simple en SDL (clone PONG) où je dois avoir une pression sur une touche en continu. Le problème que j'ai, c'est que quand j'appuie sur un bouton, il réagit, attend une courte période et continue à appuyer sur la touche en continu.sdl obtention de la touche en continu appuyant sur

Je me demande comment j'obtiens ce petit délai pour m'en aller.

Voici mon code:

while (running) 
{ 
    while (SDL_PollEvent(&event)) 
    { 
     //update the game 
     if (event.type == SDL_QUIT) 
     { 
      quit_game(); 
      running = false; 
     } 

     if(event.type == SDL_KEYDOWN) 
     { 
      switch (event.key.keysym.sym) 
      { 

      case SDLK_DOWN: 
       move_paddle(UP); 
       break; 

      case SDLK_UP: 
       move_paddle(DOWN); 
       break; 

      default: 

       break; 
      } 
     } 
    } 
    draw_game(); 
    move_ball(); 
    SDL_Delay(15); 
} 
+0

Regardez comme si vous obtenez les résultats des événements répétition automatique. 'SDL_GetKeyboardState' m'a pris environ 5 secondes pour google" statut clé SDL ". –

Répondre

0

La première chose que je l'ai fait était que je voulais enlever le petit retard et d'obtenir le mouvement de la palette plus lisse. J'ai introduit 2 nouvelles variables booléennes globales pour garder une trace de la touche enfoncée. Je les initie avec la valeur false car aucune touche n'est actuellement pressée.

Dans mon commutateur, je définis la valeur de ces variables booléennes pour correspondre à ce qui est actuellement enfoncé.

 if(event.type == SDL_KEYDOWN) 
     { 
      switch (event.key.keysym.sym) 
      { 

      case SDLK_DOWN: 
       key_up = true; 
       key_down = false; 
       break; 

      case SDLK_UP: 
       key_down = true; 
       key_up = false; 
       break; 

      default: 

       break; 
      } 
     } 

Puis dans la première boucle while i faire deux si-cas pour les deux clés qui peuvent être pressés et appeler la fonction de mouvement dans ces cas-cas.

if (key_up) 
     move_paddle(UP); 
    else if (key_down) 
     move_paddle(DOWN); 

Quand je l'ai fait le retard et le mouvement a disparu de pagaie était lisse, mais elle a aussi généré un autre gros problème, la palette ne pouvait pas rester immobile en un seul endroit (à l'exception des boundraries). J'ai alors réalisé que le code cherche seulement une clé qui est pressée et ne réagit pas à une clé qui est libérée. J'ai alors compris que si une clé est relâchée (dans ce cas, la touche UP ou la touche DOWN), les deux valeurs booléennes doivent être mises à false car aucune touche n'est enfoncée.

Ce que j'ai fait, c'est que j'ai fait une autre instruction if après le if(event.type == SDL_KEYDOWN) qui désactiverait le mouvement de la raquette si aucune touche n'était enfoncée. Lorsque j'ai implémenté tout cela dans mon code, le jeu a fonctionné comme un charme.

Pour ceux qui sont intéressés, voici mon nouveau code final:

int gameloop() 
{ 
SDL_Event event; 
bool running = true; 
bool key_up = false; 
bool key_down = false; 

while (running) 
{ 
    while (SDL_PollEvent(&event)) 
    { 
     //update the game 
     if (event.type == SDL_QUIT) 
     { 
      quit_game(); 
      running = false; 
     } 

     if(event.type == SDL_KEYDOWN) 
     { 
      switch (event.key.keysym.sym) 
      { 

      case SDLK_DOWN: 
       key_up = true; 
       key_down = false; 
       break; 

      case SDLK_UP: 
       key_down = true; 
       key_up = false; 
       break; 

      default: 

       break; 
      } 
     } 

     if (event.type == SDL_KEYUP) 
     { 
      key_down = false; 
      key_up = false; 
     } 
    } 
    if (key_up) 
     move_paddle(UP); 
    else if (key_down) 
     move_paddle(DOWN); 

    move_ball(); 
    ai_paddle_move(); 
    draw_game(); 
    printf("Player: %d | AI: %d\n", player, ai); 
    SDL_Delay(15); 
} 

return 1; 
}