Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème clavier de maintien d'appui multiples

Sujet résolu
    27 octobre 2016 à 20:54:13

    Je ne sais pas s'il s'agit d'un problème de la SDL, de mon matériel, du pilote, ou de windows: dans le doute je poste donc ici.

    Je programme un simple jeu avec la SDL (en c, pas c++) et j'essaie de gérer les entrées clavier non pas en me servant des événements (SDL_Poll/WaitEvent) mais de l'état du clavier, avec SDL_KeyState()/SDL_PumpEvents(). Pour en tester les fonctionnalités j'ai créé un executable bidon dont voici le code;

    #include <stdlib.h>
    #include <SDL/SDL.h>
    
    int main ( int argc, char** argv )
    {
        SDL_Init(SDL_INIT_VIDEO);
        freopen( "CON", "w", stdout );
        freopen( "CON", "w", stderr );
        SDL_Surface* ecran = SDL_SetVideoMode(100,100,24,SDL_HWSURFACE|SDL_DOUBLEBUF); //Une surface est nécessaire pour donner le focus à l'application
    	const Uint8 *state = SDL_GetKeyState(NULL);
    	while(state[SDLK_ESCAPE]==0){
    		if(state[SDLK_a]){
    			printf("a");
    		}
    		if(state[SDLK_b]){
    			printf("b");
    		}
    		if(state[SDLK_c]){
    			printf("c");
    		}
    		if(state[SDLK_d]){
    			printf("d");
    		}
    		if(state[SDLK_e]){
    			printf("e");
    		}
    		if(state[SDLK_f]){
    			printf("f");
    		}
    		SDL_Delay(300);
    		printf("\n");
    		SDL_PumpEvents();
    	}
    	SDL_FreeSurface(ecran);
    	SDL_Quit();
    	return 0;
    }
    

    (les freopens() servent à rendre à la console l'affichage des sorties standards, sans quoi elle partiraient dans des fichiers)

    Le but de cet executable est d'afficher quelles clefs (de a à f) sont actuellement pressées, par intervalle de 300ms. Un premier problème est que l'entrée de la SDL considère que tout les claviers sont en qwerty, mais c'est négligeable. Mon problème ici est que selon des règles apparemment arbitraires, certaines clefs seront ignorées si d'autres sont pressées. Par exemple, si a & c sont pressées, appuyer sur b ne changera rien, l'affichage perdurera en tant qu'une suite de "ab\n". J'ai branché un clavier en USB pour tester, et avec les deux ensemble et un peu de patience pour tester différents ordres d'appui il m'est possible d'afficher toutes les lettres de a à f, mais cela est loin d'être un résultat satisfaisant.

    Je souhaite que quel que soit l'ordre dans lequel les touches sont appuyées, et que peu importe si l'appui est prolongé, toutes soient considérées. Quelqu'un peut-il m'aider?

    • Partager sur Facebook
    • Partager sur Twitter
    ♫ 99 petits problèmes de code. ♪ J'en prend un, ♪ je le répare. ♫ 137 petits problèmes de code...
      28 octobre 2016 à 15:49:17

      Salut  ! Pour ton problème de Qwerty ou Azerty sert toi de SDL_SCANCODE à la place de SDLK. SDL_SCANCONE donne "l'emplacement" de la touche sur le clavier et non sa valeur (en gros).

      As-tu essayé de remplacer SDL_GetKeyState(NULL) par SDL_GetKeyboardState(NULL) ?

      Sinon j'avoue ne pas bien comprendre ton problème... Tu dis que si tu appuies et restes appuyé sur la touche a, la SDL ne détectera pas si une autre touche est enfoncée ?

      Et attention, la version 1.2 de la SDL est assez vieille, pense à passer en 2.0 au moins, et d'essayer de ne plus utilisé les Surfaces qui ne sont gérées que la CPU...

      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2016 à 15:56:03

        Bonjour,

        Il y a eu une discussion sur ce sujet sur le forum python avec tkinter. L'explication apportée «envoie la faute» sur le clavier et ne dépendrait donc rien d'autre → https://openclassrooms.com/forum/sujet/tkinter-bind-plusieurs-touches

        • Partager sur Facebook
        • Partager sur Twitter
        First solve the problem. Then, write the code. ~ John Johnson
          28 octobre 2016 à 18:11:52

          Xenoliss a écrit:

          Salut  ! Pour ton problème de Qwerty ou Azerty sert toi de SDL_SCANCODE à la place de SDLK. SDL_SCANCONE donne "l'emplacement" de la touche sur le clavier et non sa valeur (en gros).

          As-tu essayé de remplacer SDL_GetKeyState(NULL) par SDL_GetKeyboardState(NULL) ?

          Sinon j'avoue ne pas bien comprendre ton problème... Tu dis que si tu appuies et restes appuyé sur la touche a, la SDL ne détectera pas si une autre touche est enfoncée ?

          Et attention, la version 1.2 de la SDL est assez vieille, pense à passer en 2.0 au moins, et d'essayer de ne plus utilisé les Surfaces qui ne sont gérées que la CPU...

          Le problème Qwerty est, comme je l'ai dit, moindre. Je me doute qu'il existe une douzaine de manières de le résoudre, mais je m'en préoccuperai plus tard.

          SDL_GetKeyboardState() fait partie de la SDL2, j'en suis encore à utiliser la SDL 1.2.15. Ces deux fonctions semblent toutefois avoir le même comportement, à savoir fournir un tableau indiquant l'état du clavier. Mon problème viendrait plutôt du fait que SDL_PumpEvent() ne reçoit ou ne gère pas les maintiens de touche multiples. Sachant que j'avais déjà eu ce problème en java et sous mon boot ubuntu, je pense qu'il s'agit d'un problème de matériel ou de pilote, les fonctions ne sont pas à remettre en cause.

          Exemple concret; avec un seul clavier, il m'est impossible d'avoir A, D, et X enfoncées en même temps. Si j'en ai une des trois d'enfoncée je peux en utiliser une autre, mais si j'en ai deux d'enfoncée la troisième ne fonctionnera pas.

          Je sais que je devrais passer à la nouvelle version mais là encore je vais aussi arrêter d'utiliser windows pour programmer, et de plus je doute que cela résolve ce problème.

          Picodev

          Merci, il s'agit donc bien d'une limitation matérielle, et une impossible à contourner, qui plus est.

          Je suis quand même surpris que changer l'order dans lequel on ajoute les appui de clefs permet de considérer plus de clefs à la fois. Je pense qu'il est temps pour moi de potasser un peu mon électronique..

          • Partager sur Facebook
          • Partager sur Twitter
          ♫ 99 petits problèmes de code. ♪ J'en prend un, ♪ je le répare. ♫ 137 petits problèmes de code...

          Problème clavier de maintien d'appui multiples

          × 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