[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 :wink: ) 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:
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:
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:
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:
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 ?