IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Appui simultané sur les deux touches SHIFT


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 79

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut Appui simultané sur les deux touches SHIFT
    Bonjour à tous pour mon premier post !

    Dans mon émulateur dcmo5, je cherche à tester l'appui simultané sur les touches SHIFT gauche et droite.
    J'ai vérifié les points suivants :
    1) Quand SHIFT gauche est enfoncé, l'appui ou le relâchement de SHIFT droit ne génère pas les évènement SDL_KEYDOWN et SDL_KEYUP (et réciproquement)
    2) La fonction SDL_GetKeyState() donne l'état "enfoncé" pour la première touche SHIFT appuyée, mais pas pour la deuxième. Elle détecte bien SDLK_LSHIFT et SDLK_RSHIFT séparément, mais jamais les deux en même temps.
    3) Même comportement pour la fonction SDL_GetModState(). La première touche SHIFT enfoncée est détectée, mais pas la deuxième.

    Ma question : Est-il possible, par un autre moyen, de détecter l'appui simultané sur les deux touches SHIFT ?

    Précisions :
    - les touches CTRL gauche et droite ont le même comportement que les touches SHIFT
    - les touches ALT gauche et droite n'ont pas tout à fait le même comportement : ALT droit est détecté si ALT gauche est enfoncé. En revanche ALT gauche n'est pas détecté si ALT droit est enfoncé.
    - les touches alphanumériques n'ont pas ces problèmes.
    - j'ai fait les tests sur PC dans Windows XP, mais de mémoire le comportement est le même dans Linux
    - ce problème est lié à SDL. Dans l'API Win32, les fonctions GetAsyncKeyState(VK_RSHIFT) et GetAsyncKeyState(VK_LSHIFT) donnent la position correcte des touches SHIFT

    Daniel

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Cela doit être une différence entre système d'exploitation car sur mon linux avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <SDL.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    int gestion_clavier(int sym)
    {
        int res=1;
        switch(sym)
        {
        case SDLK_q:
            res = 0;
            break;
        case SDLK_RSHIFT:
            printf("Rshift pressed\n");
            break;
        case SDLK_LSHIFT:
            printf("Lshift pressed\n");
            break;
        }
        return res;
    }
     
    int gestion_clavier_up(int sym)
    {
        int res=1;
        switch(sym)
        {
        case SDLK_q:
            res = 0;
            break;
        case SDLK_RSHIFT:
            printf("Rshift released\n");
            break;
        case SDLK_LSHIFT:
            printf("Lshift released\n");
            break;
        }
        return res;
    }
     
    int main(void)
    {
        SDL_Surface *screen;
        SDL_Event event;
        int cont = 1;
     
        /* Initialisation */
        if(SDL_Init(SDL_INIT_VIDEO)!=0) {
            return EXIT_FAILURE;
        }
     
        screen = SDL_SetVideoMode(800, 600, 32, SDL_DOUBLEBUF | SDL_HWSURFACE);
        if(screen==NULL) {
            cont = 0;
        }
     
        while(cont) {
            while(SDL_PollEvent(&event)) {
                switch(event.type) 
                {
                    case SDL_KEYDOWN:
                        cont = gestion_clavier(event.key.keysym.sym);
                        break;
                    case SDL_KEYUP:
                        cont = gestion_clavier_up(event.key.keysym.sym);
                        break;
                    case SDL_QUIT:
                        cont = 0;
                        break;
                    default:
                        break;
                }
            }
     
            SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
            SDL_Flip(screen);
        }
     
        SDL_Quit();
        return EXIT_SUCCESS;
    }
    J'obtiens bien l'événement des deux shifts, peu importe lequel est le premier appuyé...

    Il faudrait que je teste chez moi sur windows pour voir,
    Jc

  3. #3
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    C'est pour cela que je n'aime pas les bibliothèques toutes faites comme SDL....
    avec les API Windows tu peux faire ce que tu veux le seul inconvénient c'est que ce ne sera pas portable sous Linux

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    avec les API Windows tu peux faire ce que tu veux le seul inconvénient c'est que ce ne sera pas portable sous Linux
    Soit, mais cela est la principale raison pourquoi la SDL est pratique. A part quelques détails comme celui-ci, c'est un grand avantage.

    Jc

  5. #5
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 79

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    C'est pour cela que je n'aime pas les bibliothèques toutes faites comme SDL....
    avec les API Windows tu peux faire ce que tu veux le seul inconvénient c'est que ce ne sera pas portable sous Linux
    C'est vrai. Tous mes émulateurs ont été programmés avec l'API Win32 et fonctionnent bien. Mais pour les porter sur d'autres systèmes SDL est un outil extraordinaire. S'il a des faiblesses il ne faut pas le rejeter, mais au contraire aider les développeurs à l'améliorer. C'est bien mon intention.

    Daniel

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 79

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Compilation du programme de fearyourself avec devcpp et exécution dans Windows XP sp2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (appui sur Lshift)
    Lshift pressed
    (relachement de Lshift)
    Lshift released
    (appui sur Rshift)
    Rshift pressed
    (relachement de Rshift)
    Rshift released
    (appui sur Lshift)
    Lshift pressed
    (appui sur Rshift : rien ne se passe)
    (relachement de Rshift : rien ne se passe)
    (appui sur Rshift : rien ne se passe)
    (relachement de Rshift : rien ne se passe)
    (relachement de Lshift)
    Lshift released
    Le problème dans Windows est confirmé, et je cherche toujours un contournement...

    Daniel

  7. #7
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Je pense plutôt que ça doit venir de chez toi car je viens de tester le code de fearyourself chez moi sur windows xp sp2 et ça marche nikel :

    Lshift pressed
    Lshift released
    Rshift pressed
    Rshift released
    J'ai modifié juste ça par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main( int argc, char* args[] )
    ça m'étonnais car je n'avais jamais entendu parler de ce problème

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 540
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 540
    Par défaut
    Citation Envoyé par dcmo5 Voir le message
    C'est vrai. Tous mes émulateurs ont été programmés avec l'API Win32 et fonctionnent bien. Mais pour les porter sur d'autres systèmes SDL est un outil extraordinaire. S'il a des faiblesses il ne faut pas le rejeter, mais au contraire aider les développeurs à l'améliorer. C'est bien mon intention.
    Daniel
    ok alors je conseillerais de modifier les sources de SDL et de recompiler les dll.
    Mais je doute que cela soit aisé à réaliser..
    effectivement rien ne t'empêche de trifouiller les sources par contre tu seras obligé de fournir tes propres dll modifiées

  9. #9
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 79

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    ok alors je conseillerais de modifier les sources de SDL et de recompiler les dll.
    Pas d'autre solution de contournement ?
    Alors il est plus sage d'abandonner SDL et de revenir à l'API Win32. Dommage pour les autres systèmes.

    Daniel

  10. #10
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Âge : 79

    Informations forums :
    Inscription : Novembre 2007
    Messages : 18
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Cela doit être une différence entre système d'exploitation
    C'est probablemement l'explication, car mon code est strictement équivalent au tien. Dans Windows chacun des deux SHIFTs est bien détecté séparément, mais si on ne relâche pas le premier le deuxième n'est pas détecté. Ton test dans Windows va probablement le confirmer. J'attends le résultat avec impatience. Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Affichage simultané sur les écrans de deux utilisateurs
    Par jrdubail dans le forum Réseau et multijoueurs
    Réponses: 0
    Dernier message: 03/09/2012, 18h38
  2. [XL-2010] Avoir la même échelle sur les deux axes X;Y
    Par znmile dans le forum Excel
    Réponses: 3
    Dernier message: 13/06/2011, 12h13
  3. Appliquer lumière sur les deux faces d'un polygone
    Par choko83 dans le forum OpenGL
    Réponses: 8
    Dernier message: 21/01/2011, 10h49
  4. [1.x] Relation n:n, enregistrement simultané dans les deux tables
    Par etoileweb dans le forum Symfony
    Réponses: 0
    Dernier message: 11/11/2010, 17h19
  5. Réponses: 19
    Dernier message: 12/04/2007, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo