Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Gestion clavier


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Gestion clavier
    Bonjour,

    comment puis-je simplement (une ligne, si possible) faire le test suivant :
    maj (gauche ou droite) est enfoncée OU verr maj est enfoncée, mais pas les deux.

    Merci

  2. #2
    Membre à l'essai
    Une simple lecture de la doc SDL te donneras la réponse.

  3. #3
    Nouveau Candidat au Club
    Non, j'ai lu la doc et je n'ai pas trouvé la réponse.
    Je sais qu'il faut utiliser SDLK_CAPSLOCK et SDLK_SHIFT, mais je ne sais pas comment.
    Merci de m'aider.

  4. #4
    Responsable 2D/3D/Jeux

    Bonjour,

    Comme le dit Giann008 ... RTFM.

    Mais bon, bref
    En partant du principe que vous savez récupéré les touches ... de la manière la plus bateau, il faut faire
    ( La variable s'appelle keys dans mon exemple )
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    if ( ( keys.keysym.key == SDLK_SHIFT && keys.keysym.key != SDLK_CAPSLOCK ) || ( keys.keysym.key == SDLK_CAPSLOCK && keys.keysym.key != SDLK_SHIFT) )

    Voilà en une ligne.

    Sinon, je suis assez étonné mais ce test est un XOR ( ou exclusif ) mais je ne sais plus le faire en C

    Sinon quelque fois, lorsque l'on ne comprend pas la doc, on cherche un peu sur internet ( et des fois, pas très très loin ) : http://loka.developpez.com/tutoriel/sdl/
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre chevronné
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if (keys.keysym.key == SDLK_SHIFT ^ keys.keysym.key == SDLK_CAPSLOCK)


    Le XOR, c'est ^



    code non tester, mais ca devrait fonctionner.

  6. #6
    Membre émérite
    Y a pas un problème dans vos tests ?
    Si keys.keysym.key == SDLK_SHIFT elle est égale à seulement SDLK_SHIFT et rien d'autre, ça doit plutôt être un tableau de touches pressées.
    Vive les roues en pierre

  7. #7
    Membre chevronné
    Il veut pas savoir si les deux touche sont presser en meme temps (dans ce cas ci, nous serions daccord -> SDL_GetKeyState), mais il veut savoir si une touche OU (exclusif) une autre touche a été presser.

    Donc, les condition sont valide.

    Apres, s'il veut tester deux touche -> SDL_GetKeyState.

  8. #8
    Membre averti
    Citation Envoyé par Djakisback Voir le message
    Y a pas un problème dans vos tests ?
    Si keys.keysym.key == SDLK_SHIFT elle est égale à seulement SDLK_SHIFT et rien d'autre, ça doit plutôt être un tableau de touches pressées.
    Tout à fait, la réponse donnée par LittleWhite ne marchera pas. Une recherche rapide dans la doc de donne la fonction SDL_GetKeyState :

    http://www.libsdl.org/cgi/docwiki.cgi/SDL_GetKeyState

    L'exemple donné résout quasiment ton problème.

  9. #9
    Membre émérite
    Citation Envoyé par SofEvans Voir le message
    Il veut pas savoir si les deux touche sont presser en meme temps (dans ce cas ci, nous serions daccord -> SDL_GetKeyState), mais il veut savoir si une touche OU (exclusif) une autre touche a été presser.

    Donc, les condition sont valide.

    Apres, s'il veut tester deux touche -> SDL_GetKeyState.
    Hum, c'est bien ce que je dis :
    si :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    keys.keysym.key == SDLK_SHIFT

    alors :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    keys.keysym.key != SDLK_CAPSLOCK


    donc le test est inutile et équivaut à :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    if(keys.keysym.key == SDLK_SHIFT || keys.keysym.key == SDLK_CAPSLOCK)
    Vive les roues en pierre

  10. #10
    Membre chevronné
    Effectivement, le test pouvait bien se simplifier, mais le test avec XOR est équivalent, bien que peu repandue.

  11. #11
    Membre émérite
    Le résultat est équivalent, en revanche il me semble que dans un XOR les 2 propositions doivent être évaluées, contrairement au OR où la 2e proposition n'est évaluée que si la 1re est false (il me semble ).
    Vive les roues en pierre

  12. #12
    Membre à l'essai
    Le ou exclusif, n'existe pas en C... Du moins pour les opérateurs logiques(&&, ||).
    Effectivement, pour les opérateurs bits à bits, c'est ^, mais aucune utilitée ici...

    Le problème normalement si tu gères tes events à la manière de monsieur tou le monde, genre
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(SDL_PollEvent(&event)
    {
       ...
    }

    tu ne peux pas tester, l'appui de 2 touches simultanément... c'est impossible!

    Il y a des solutions à bases de flags, etc...
    Le problème, c'est que la touche CAPS_LOCK, va conserver son état, pressé, non pressé...
    Il faut que tu précises ce que tu souhaites.

    Sinon, SDLK_SHIFT, n'existe pas...
    Voir du coté de SDLMod...
    Pour un truc comme ça, précise mieux le comportement attendu...
    Il suffit d'une pression sur la touche majeur (CAPS_LOCK), pour que toutes les solutions proposées jusque là soient nulles.

  13. #13
    Responsable 2D/3D/Jeux

    Sachez juste, que j'ai fait une chose de grave en écrivant ma réponse. C'est que j'ai répondu sous le coup de la colère ( je m'en excuse ). Vu que notre cher ami qui a ouvert le projet à dit qu'il ne trouvait rien dans la documentation.

    Du coup, je n'ai pas faut plus de recherche que cela, et j'ai écrit ma réponse que sur des souvenirs ( et sur les flags présenté par l'ouvreur de sujet )

    Après pour donner des réponses plus claires, il semble que l'auteur veut juste savoir si l'utilisateur a appuyé sur une touche ou une autre. Ce n'est pas deux touches ( Enfin c'est ma compréhension ).
    Après, le test équivalent à cette lecture c'est bien sur:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    if ( key == TOUCHE1 || key == TOUCHE2 )

    Avec une récupération des évènements à la Monsieur tout le monde. D'ailleurs je me demande quel est le résultat d'un appuie sur les deux touches en même temps, surement deux tours dans la boucle pour traiter deux évènements distincts. ( Donc potentiellement deux actions ). Donc peut être que cela ne pose pas de problème ( dépendant de l'objectif final ).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

###raw>template_hook.ano_emploi###