Je plussoie Praetonus. Si tu décides de ne pas utiliser SDL_GetKeyboardState
, tu peux créer un tableau de taille SDL_NUM_SCANCODES
et une fonction qui remplit ce tableau à chaque tour de boucle. Ta fonction se charge alors de mettre à jour tes évènements. Le mieux est alors de créer une structure qui se charge de gérer tes évènements. Par exemple :
| struct Input
{
SDL_bool key[SDL_NUM_SCANCODES];
SDL_bool quit;
}
|
Et la fonction qui la mettrait à jour serait du genre :
1
2
3
4
5
6
7
8
9
10
11
12
13 | void UpdateEvent(struct Input *in)
{
SDL_Event e;
while(SDL_PollEvent(&e))
{
if(e.type == SDL_QUIT)
in->quit = SDL_TRUE;
else if(e.type == SDL_KEYDOWN)
in->key[e.key.keysym.scancode] = SDL_TRUE;
else if(e.type == SDL_KEYUP)
in->key[e.key.keysym.scancode] = SDL_FALSE;
}
}
|
Je t’aurais bien renvoyé sur le tutoriel que je suis en train d’écrire sur la SDL2, mais je n’ai même pas encore commencé à rédiger la partie sur les évènements. En gros, cela te permet de séparer les différentes composantes de ton programme. Gestion des évènements d’un côté, gestion de l’affichage de l’autre… Avec ce que je viens de proposer, ta boucle principale devient (j’ai supprimé l’affichage en cas de touche appuyée, mais on peut le remettre)
1
2
3
4
5
6
7
8
9
10
11
12 | // Initialisations, création de in...
while(!in.quit && !in.key[SDL_SCANCODE_ESCAPE])
{
UpdateEvent(&in);
if(in.key[SDL_SCANCODE_DOWN])
player.y += 1;
SDL_RenderCopy(renderer, texture, NULL, &player);
SDL_RenderPresent(renderer);
SDL_Delay(20);
}
|
Ici, j’affiche à chaque tour de boucle, mais j’attends également 20 ms avant de passer à l’image suivante (par contre, je ne sais pas si c’est voulu, mais tu n’effaces pas avant de redessiner).
PS : je vois que tu codes en C++, alors ce que je propose n’est sûrement pas top niveau conception. J’imagine qu’il faudrait créer une classe pour gérer les évènements.Je laisse les pros du C++ en parler.
EDIT :
Et question idiote mais… pourquoi ce délai ? Bug de SDL ou c'est « volontairement » imposé ? Je peux comprendre le problème inverse : admettons qu'on ai un menu, si en appuyant juste un peu trop on descend de 4 choix au lieu d'un seul ben ça serait tout aussi chiant. Mais bon, je trouve que ça devrait être « paramètrable » comme dans SDL 1.2 (mais si j'ai bien compris : sans ruser, ce n'est pas possible :/ ).
Même en SDL 1.2 c’était mieux de s’en occuper soi-même en fait. Avec la méthode que j’ai à peu près implémenté, tu gères vraiment tes évènements comme tu veux. Tu peux décider que tu veux de la répétition de touche pour certaines touches seulement. Par exemple, dans un jeu, tu pourrais vouloir que tant que le joueur appuie sur les touches directionnelles, il avance, mais qu’il doive relâcher la touche de tir et la represser pour faire un nouveau tir.