Partage
  • Partager sur Facebook
  • Partager sur Twitter

Empêcher l'utilisateur de maintenir une touche

Gérer les touches du clavier en SDL

Sujet résolu
19 janvier 2020 à 19:01:25

Bonjour, j'ai un problème sur la SDL.

J'essaie de créer un mini-jeu où le principe consiste à taper la lettre qui est affichée à l'écran. Taper la bonne lettre fait augmenter notre score ainsi qu'un combo pour pouvoir avoir plus de points. La lettre à taper va changer que la lettre de l'utilisateur soit correcte ou fausse.

J'ai réussi la quasi-intégralité de ce mini-jeu mais je n'arrive pas à régler le problème des répétitions : en fait, si je maintiens une touche (par exemple 'e'), le programme va quand même continuer à créer d'autres lettres. Il suffit donc de maintenir une seule lettre et comme les lettres sont changées toutes les millisecondes, il est très facile de gagner des points.

J'ai donc essayé d'empêcher le joueur de pouvoir maintenir une touche mais en vain. J'ai essayé avec SDL_KEYUP et SDL_EnableKeyRepeat mais cela ne fonctionne pas. Voici mon code source (je suis sous SDL 1.2) :

	SDL_EnableKeyRepeat(0,0);
	while(temps_minijeu_2<=10)
	{
		SDL_PollEvent(&event);
		tempsactuel=SDL_GetTicks();	

		if(event.type == SDL_QUIT)
		{exit(0);}
		
		//1s écoulé = on ajoute 1 au compteur
		if(tempsactuel - tempsprecedent_1s > 1000)
		{ajouter_1s_temps(ecran,pos_temps,texte_temps,&temps_minijeu_2,&tempsprecedent_1s,tempsactuel);}

		if(event.type==SDL_KEYDOWN)
		{
			if(event.key.keysym.sym == lettre)
			{
				combo++;
				score_minijeu_2=score_minijeu_2+combo;
			}
			
			else
			{combo=0;}
			
			lettre='a'+rand()%26;
			changer_score_combo_temps(ecran,texte_score,texte_combo,texte_lettre,lettre,score_minijeu_2,combo,pos_score,pos_combo,pos_lettre);			
		}
		SDL_Delay(30);
	}


Je suis quasi-certain que le problème vient du if(event.type == SDL_KEYDOWN) mais je ne vois pas comment le régler.

Merci à vous!

  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2020 à 19:42:46

Hello,

Ajoute en ligne 27 bis: event.type=SDL_NOEVENT. Ça fait un bout de temps que je n'ai plus utilisé sdl 1.x, mais je pense que cela résoudra ton problème.

-
Edité par edgarjacobs 19 janvier 2020 à 20:03:51

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

19 janvier 2020 à 19:58:57

Malheureusement oui, en fait je mets bien SDL_EnableKeyRepeat(0,0) et pourtant je peux quand même maintenir les touches.  Je pense que SDL_KEYDOWN ne prend pas en compte le SDL_EnableKeyRepeat alors que les SDL_K oui. Si quelqu'un a la réponse je lui en remercie!
  • Partager sur Facebook
  • Partager sur Twitter
19 janvier 2020 à 20:05:34

Re,-

Entretemps, j'ai modifié mon message, j'avais mal lu ton code

En fait, si mes souvenirs sont exacts, si SDL_PollEvent() n'a pas de nouvel event à fournir, la valeur du dernier event reçu n'est pas modifiée, ce qui fait que tu rentres dans le if(....==SDL_KEYDOWN)

-
Edité par edgarjacobs 19 janvier 2020 à 20:09:00

  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

19 janvier 2020 à 20:56:25

Encore merci! Je ne pensais pas que l'erreur proviendrait de là. Je mets le sujet en résolu.

EDIT : Maintenant le jeu force l'utilisateur à  taper une lettre, le compteur ne s'incrémente que si l'on tape une lettre. En fait le temps est bien stocké, mais comme on est obligé d'attendre une touche du clavier, le compteur va s'incrémenter de beaucoup de secondes si l'on attend beaucoup (si on attend 3 secondes sans taper une lettre, le compteur ne va pas augmenter pendant ces 3 secondes, mais dès que la lettre sera tapée, le compteur va augmenter toutes les secondes jusqu'à 3).

Je vais faire avec mais si quelqu'un a une solution à ce problème, je suis preneur. 

-
Edité par Shiruba 19 janvier 2020 à 21:18:54

  • Partager sur Facebook
  • Partager sur Twitter
20 janvier 2020 à 1:13:14

Salut,

Il faut vérifier le retour du pollevent. Il s'agît en fait d'une file, et un unique élément est dépilé à l'appel de pollevent.

Pour dépiler le contenu complet de la file, on utilise généralement le pollevent ainsi :

while(SDL_PollEvent(&event))
{
   if (event.type)
    blablabla;

   ...
}

Une base correcte de gestion des événements est disponible dans ce tuto. J'utilise personnellement cette méthode que j'ai poussée plus loin.

Pour ton autre problème, il suffit d'incrémenter ton temps en dehors d'un test conditionnel. D'un autre côté quand on besoin de faire des fonctions avec 10 arguments, c'est signe qu'on a mal pensé un truc...

Bonne continuation.

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.