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

DirectX Discussion :

[DirectInput] Gestion des touches en mode fenêtré


Sujet :

DirectX

  1. #1
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut [DirectInput] Gestion des touches en mode fenêtré
    Bonjour, c'est encore moi, j'utilise DirectInput

    En mode plein écran, les touches de direction fonctionnent.

    Mais en mode fenêtré, c'est comme si je maintenait tout le temps la même touche enfoncé (souvent flêche droite, échap, ou entrée) alors que je ne touche à rien.

    voici mon code d'initialisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            DirectInputCreate(_instance, DIRECTINPUT_VERSION, &lpDI, NULL);
            lpDI->CreateDevice(GUID_SysKeyboard, &pKeyboard, NULL);
            pKeyboard->SetDataFormat(&c_dfDIKeyboard);
            pKeyboard->SetCooperativeLevel(_handle, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
            pKeyboard->Acquire();
    et le code de la méthode appelée régulièrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            char l_buffer[256];
     
            pKeyboard->GetDeviceState(sizeof(l_buffer), (LPVOID)&l_buffer);
     
            if (l_buffer[DIK_LEFT]  & 0x80)       KeyPressed(keyleft);
            if (l_buffer[DIK_RIGHT] & 0x80)       KeyPressed(keyright);
            if (l_buffer[DIK_UP]    & 0x80)       KeyPressed(keyup);
            if (l_buffer[DIK_DOWN]  & 0x80)       KeyPressed(keydown);
            if (l_buffer[DIK_RETURN]& 0x80)       KeyPressed(keyreturn);
            if (l_buffer[DIK_TAB]   & 0x80)       KeyPressed(keytab);
            if (l_buffer[DIK_SPACE] & 0x80)       KeyPressed(keyspace);
            if (l_buffer[DIK_ESCAPE]& 0x80)       KeyPressed(keyescape);
            if (l_buffer[DIK_F1]    & 0x80)       KeyPressed(keyf1);
    Je voulais savoir comment on pouvait remédier au problème
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  2. #2
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    KeyPressed, c'est une de tes fonctions perso ? Si c'est le cas et que cette fonction modifie une valeur (genre qu'elle met un bool à true), il ne faut pas oublier de mettre toutes les valeurs à false avant d'utiliser KeyPressed.

  3. #3
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    oui, keypressed c'est une fonction perso, mais qui se contente de répercuter graphiquement le résultat de la touche pressée.

    mais en fait, je pense que le problème ne se situe pas à l'intérieur de ma fonction KeyPressed, car un point d'arret sur pKeyboard->GetDeviceState(...) suivi du mode pas à pas, me montre qu'il rentre régulièrement et uniquement toujours dans le meme cas (if l_buffer[DIK_RIGHT)....) et dans aucun autre, et ce meme si je n'enfonce jamais (de toute la durée de vie de mon programme) de touche... Mais ceci ne se produit qu'en mode fenetré, et jamais en mode plein écran (en mode plein écran tout se passe très bien)... Alors je ne comprends pas...

    faut-il mettre à zero lles 256 chars de l_buffer avant d'appeler pKeyboard->GetDeviceState(...) ?
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  4. #4
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    J'ai un livre sur DirectX qui dit qu'avant d'utiliser GetDeviceState, il faut faire un ZeroMemory sur le tableau qui recevra les données du clavier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            char l_buffer[256];
     
            ZeroMemory( &l_buffer, sizeof(l_buffer) );
     
            pKeyboard->GetDeviceState(sizeof(l_buffer), (LPVOID)&l_buffer);
    Si ca ne marche pas, récupères le résultat de GetDeviceState. Si c'est DIERR_INPUTLOST, le périphérique a été perdu, et il faut utiliser Acquire à nouveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            char l_buffer[256];
            HRESULT hr;
     
            ZeroMemory( &l_buffer, sizeof(l_buffer) );
     
    getstate:
            hr = pKeyboard->GetDeviceState(sizeof(l_buffer), (LPVOID)&l_buffer);
     
            if (hr==DIERR_INPUTLOST)
            {
                    pKeyboard->Acquire();
                    goto getstate;
            }
    Désolé pour le goto.

  5. #5
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Je pense que c'est ZeroMemory(l_buffer, sizeof(l_buffer) ); sans le &, mais de toute facon avec ou sans ca change rien... meme le coup du périphérique perdu ca change rien...

    Dave, tu as déjà essayé directInput en mode fenêtré, ca marche chez toi ?

    Parceque là, je comprends plus rien à la vie moi

    J'ai essayé en remplacant par if (GetKeyState(VK_ESCAPE) & Mask), ne marche aps non plus... comprends pas, avec le mask = 0x8000
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  6. #6
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Là, je ne sais pas... Peut-être que si j'avais le code source... (bien qu'un programmeur ne veuilles jamais montrer son code source, enfin c'est mon cas en tout cas )

  7. #7
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    avec GetKeyState, ca marche, mais il faut faire un processmessages avant...

    mais avec DirectInput, ca ne marche toujours pas

    Je vais essayé de faire une appli exemple, ou y'a juste directInput (j'utilise c++ builder 6) et apres je t'envoie tout ca si tu veux
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

  8. #8
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    OK.

  9. #9
    Membre actif
    Homme Profil pro
    Création de jeux video (en amateur)
    Inscrit en
    Mars 2003
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cantal (Auvergne)

    Informations professionnelles :
    Activité : Création de jeux video (en amateur)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 408
    Points : 260
    Points
    260
    Par défaut
    Alors g fait un nouveau projet avec builder,

    j'ai touché à rien, is ce n'est project1.cpp ou j'ai mis ce qu'il suit, et j'ai inclus les lib c_input.lib, dinput.lib et dinput8.lib

    ca compile, mais ca marche pas

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include <dinput.h>
     
    //---------------------------------------------------------------------------
    USEFORM("Unit1.cpp", Form1);
    //---------------------------------------------------------------------------
    LPDIRECTINPUT lpDI;
    LPDIRECTINPUTDEVICE pKeyboard;
     
    void Deinitialize()
    {
            if (pKeyboard)
            {
                    pKeyboard->Unacquire();
                    pKeyboard->Release();
                    pKeyboard = NULL;
            }
            if (lpDI)
            {
                    lpDI->Release();
                    lpDI = NULL;
            }
    }
     
    bool Initialize(HINSTANCE _instance, HANDLE _handle)
    {
            Deinitialize();
     
            DirectInputCreate(_instance, DIRECTINPUT_VERSION, &lpDI, NULL);
            lpDI->CreateDevice(GUID_SysKeyboard, &pKeyboard, NULL);
            pKeyboard->SetDataFormat(&c_dfDIKeyboard);
            pKeyboard->SetCooperativeLevel(_handle, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);
            pKeyboard->Acquire();
     
            return true;
    }
     
     
    void Execute()
    {
         // GDI test
     
     
    /*        const SHORT Mask = 32768;
     
            Application->ProcessMessages();
     
            if (GetKeyState(VK_ESCAPE) & Mask)      ShowMessage("DIK_ESCAPE");
            if (GetKeyState(VK_UP)     & Mask)      ShowMessage("DIK_UP");
            if (GetKeyState(VK_DOWN)   & Mask)      ShowMessage("DIK_DOWN");
            if (GetKeyState(VK_LEFT)   & Mask)      ShowMessage("DIK_LEFT");
            if (GetKeyState(VK_RIGHT)  & Mask)      ShowMessage("DIK_RIGHT");
            if (GetKeyState(VK_TAB)    & Mask)      ShowMessage("DIK_TAB");
            if (GetKeyState(VK_RETURN) & Mask)      ShowMessage("DIK_RETURN");
            if (GetKeyState(VK_SPACE)  & Mask)      ShowMessage("DIK_ESCAPE");
            if (GetKeyState(VK_F1)     & Mask)      ShowMessage("DIK_F1");
    */
     
            // directInput test
     
            char l_buffer[256];
     
            ZeroMemory(l_buffer, sizeof(l_buffer));
     
            int hr = pKeyboard->GetDeviceState(sizeof(l_buffer), (LPVOID)&l_buffer);
     
            if (hr == DIERR_INPUTLOST)        { pKeyboard->Acquire(); }
     
            if (l_buffer[DIK_LEFT]  & 0x80)         ShowMessage("DIK_LEFT");
            if (l_buffer[DIK_RIGHT] & 0x80)         ShowMessage("DIK_RIGHT");
            if (l_buffer[DIK_UP]    & 0x80)         ShowMessage("DIK_UP");
            if (l_buffer[DIK_DOWN]  & 0x80)         ShowMessage("DIK_DOWN");
            if (l_buffer[DIK_RETURN]& 0x80)         ShowMessage("DIK_RETURN");
            if (l_buffer[DIK_TAB]   & 0x80)         ShowMessage("DIK_TAB");
            if (l_buffer[DIK_SPACE] & 0x80)         ShowMessage("DIK_SPACE");
            if (l_buffer[DIK_ESCAPE]& 0x80)         ShowMessage("DIK_ESCAPE");
            if (l_buffer[DIK_F1]    & 0x80)         ShowMessage("DIK_F1");
    }
     
     
    WINAPI WinMain(HINSTANCE _instance, HINSTANCE, LPSTR, int)
    {
            try
            {
                    Application->Initialize();
                    Application->CreateForm(__classid(TForm1), &Form1);
                    Initialize(_instance, Form1->Handle);
     
                    Form1->Show();
     
                    while(true)
                    {
                            Application->ProcessMessages();
                            Execute();
                    }
     
    //                 Application->Run();
            }
            catch (Exception &exception)
            {
                     Application->ShowException(&exception);
            }
            return 0;
    }
    ZTAB (Ze Text Adventure Builder)

    Logiciel très intuitif et ergonomique de création de jeux d'aventure et de livres dont vous êtes le héros.

    http://sites.google.com/site/ztabsoft/

Discussions similaires

  1. gestion des touches du clavier
    Par ines1 dans le forum C++
    Réponses: 5
    Dernier message: 27/01/2007, 20h37
  2. [SDL] Gestion des touches claviers problématique
    Par Invité4 dans le forum SDL
    Réponses: 3
    Dernier message: 13/10/2006, 21h15
  3. Gestion des touches clavier
    Par bourinator dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 18/06/2006, 16h19
  4. [TP] Gestion des données en mode graphique
    Par diden138 dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 19/05/2006, 14h52
  5. [TP]Problème dans la gestion des touches d'un tetris
    Par Guile0 dans le forum Turbo Pascal
    Réponses: 18
    Dernier message: 31/01/2005, 22h40

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