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 :

[direct input] rajouter une action quand on presse sur F4


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 114
    Points
    114
    Par défaut [direct input] rajouter une action quand on presse sur F4
    Bonjour,
    j'ai quelques difficultées avec l'api directinput. J'ai tenté de modifier l'exemple généré en visual C par le wizard direct 3D pour qu'il affiche une boite de dialogue quand on tape sur F4. Mais quand je tape sur F4 ce n'est pas une boite de dialogue, mais une infinitée (ou presque ) qui s'ouvre.

    Je m'y suis pris ainsi :
    1) j'ai rajouté INPUT_TEST_MATH dans les énumérations d'entrées possibles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    enum INPUT_SEMANTICS
    {
        (...)
        INPUT_PLAY_SOUND,       
    	INPUT_TEST_MATH,
    };
    2) j'ai mappé cette action à la touche F4
    DIACTION g_rgGameAction[] =
    {
    (...)
    { INPUT_TEST_MATH, DIKEYBOARD_F4, 0, TEXT("Mathematical tests"), },
    };

    3) j'ai rajouté dans la structure UserInput une entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct UserInput
    {
             (...)
    	BOOL bDoTestMath;  // RAJOUTE 
    };
    4) j'ai rajouté dans la fonction "void CMyD3DApplication::UpdateInput( UserInput* pUserInput ) " une ligne pour prendre en compte INPUT_TEST_MATH. J'ai racourci le code que je vous montre pour que ce soit plus lisible. Vous pouvez y voir que j'ai mis un case pour que quand INPUT_TEST_MATH soit lu en entrée je mette bDoTestMath à TRUE. Avant chaque processing je le remet aussi à FALSE

    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
     
    void CMyD3DApplication::UpdateInput( UserInput* pUserInput )
    {
        if( NULL == m_pInputDeviceManager )
            return;
     
        // Get access to the list of semantically-mapped input devices
        CInputDeviceManager::DeviceInfo* pDeviceInfos;
        DWORD dwNumDevices;
        m_pInputDeviceManager->GetDevices( &pDeviceInfos, &dwNumDevices );
     
        // Loop through all devices and check game input
        for( DWORD i=0; i<dwNumDevices; i++ )
        {
            DIDEVICEOBJECTDATA rgdod[10];
    	(...)
    	pUserInput->bDoTestMath=FALSE;
     
            // Get the sematics codes for the game menu
            for( DWORD j=0; j<dwItems; j++ )
            {
    		(...)
                switch( rgdod[j].uAppData )
                {
                    // TODO: Handle semantics for the game 
     
                    // Handle relative axis data
                    case INPUT_ROTATE_AXIS_LR: (...)
    		(...)
    		case INPUT_TEST_MATH: if( bButtonState ) pUserInput->bDoTestMath = TRUE; break;					
                }
            }
        }
    	(...)
    }
    5) finalement tout à la fin de la fonction FrameMove() j'ai rajouté le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	if (m_UserInput.bDoTestMath)
    	{
    		HWND hDlg;
    		hDlg=CreateDialog(g_hInst,(LPCTSTR)IDD_DIALOG1,NULL,NULL);
    		ShowWindow(hDlg,SW_SHOW);	
     
    	}
    quelqu'un à une idée ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2003
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    logique, tant que ton doigts reste sur la touche, tu ouvre une fenêtre... (vu que UpdateInput est appelé constamment).

    Ajoute un test pour savoir si la fenêtre est déjà visible ou non avant d'appeler ton CreateDialog et ShowWindow.

  3. #3
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    dwData
    Data obtained from or sent to the device.

    For button input, only the low byte of dwData is significant. The high bit of the low byte is set if the button was pressed; it is clear if the button was released.
    Ça fonctionne comme les events win32, il faut que tu testes
    quand la touche est relachée.
    (et il faut que tu passes en mode buffered parce que le mode immediat
    n'offre pas ce genre de détail).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par Dranor
    logique, tant que ton doigts reste sur la touche, tu ouvre une fenêtre... (vu que UpdateInput est appelé constamment).

    Ajoute un test pour savoir si la fenêtre est déjà visible ou non avant d'appeler ton CreateDialog et ShowWindow.
    mais pourtant je ne reste pas appuyé sur la touche et ça continue même quand je la relache. je comprend pas trop

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par LeGreg
    dwData
    Data obtained from or sent to the device.

    For button input, only the low byte of dwData is significant. The high bit of the low byte is set if the button was pressed; it is clear if the button was released.
    Ça fonctionne comme les events win32, il faut que tu testes
    quand la touche est relachée.
    (et il faut que tu passes en mode buffered parce que le mode immediat
    n'offre pas ce genre de détail).
    Je comprend pas trop ce que je dois faire si je teste que le bouton est relaché, car dans ce cas j'aurais mis la variable qui stoque l'état de mon bouton à FALSE mais je le fait au début de chaque fonction UpdateInput qui est appelée toute les frames.

    en tout cas merci à tout les deux , je vais déjà voir ce que je peux trouver sur ce mode buffered

Discussions similaires

  1. [ZF 1.0] appeller une action quand on est dans le layout.phtml?
    Par keokaz dans le forum MVC
    Réponses: 3
    Dernier message: 12/09/2011, 13h54
  2. Exécuter une action quand un bouton radio est coché
    Par eddycool dans le forum Langage
    Réponses: 8
    Dernier message: 29/05/2009, 10h42
  3. Réponses: 1
    Dernier message: 19/02/2007, 16h58
  4. Jouer un son quand on presse sur une touche
    Par jbidou88 dans le forum Flash
    Réponses: 2
    Dernier message: 01/06/2006, 22h05
  5. Exécuter une action quand on ferme le navigateur
    Par Leobaillard dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/01/2006, 12h41

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