Gamma del joystick analogico DirectInput
-
20-08-2019 - |
Domanda
Uso DirectInput per gestire i dispositivi di input, elenco i dispositivi e gli elementi su ciascun dispositivo.
Quando uso le levette analogiche sul mio game pad, riportano valori nell'intervallo 0-65535. Questo è sempre valido per tutti i tipi di assi assoluti?
In caso contrario: esiste un modo per scoprire l'intervallo di DIDEVICEOBJECTDATA :: dwData di un elemento di ingresso DX8 (elencato con DIDFT_ABSAXIS)? L'unica altra opzione che mi viene in mente è quella di utilizzare un po 'di calibrazione interna fatta in casa all'interno della mia app, e quel suono troppo anni '80 per essere vero.
Soluzione 2
Come Goz ha detto così dolcemente, ho fatto quanto segue, che ha funzionato:
dev->EnumObjects(EnumElementsCallback, 0, DIDFT_ALL); BOOL CALLBACK EnumElementsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID) { if ((dev->dwType & DIDFT_ABSAXIS) != 0) { DIPROPRANGE range; range.diph.dwSize = sizeof(DIPROPRANGE); range.diph.dwHeaderSize = sizeof(DIPROPHEADER); range.diph.dwHow = DIPH_BYID; range.diph.dwObj = dev->dwType; if (lDevice->mDIDevice->GetProperty(DIPROP_RANGE, &range.diph) == DI_OK) { ... = range.lMin; ... = range.lMax; } } }
Altri suggerimenti
Non puoi ottenere l'intervallo usando GetProperty e passare una struttura DIPROPRANGE appropriata da riempire? Utilizzare il GUID DIPROP_RANGE.
Da: http://www.wingmanteam.com/files/Tools /DXTweak/Readme.txt
Un driver di controller di gioco di solito riporta informazioni sulla posizione degli assi come valori interi compresi tra 0 e 655 su DirectInput. Input diretto ridimensiona linearmente questi valori fino a 0 ... 65535.