\\ Home : Articoli : Stampa
DirectInput - Joypad e Volanti
Di RobyDx (del 09/08/2007 @ 11:19:58, in DirectX9, linkato 4083 volte)

Senza dubbio la gestione delle periferiche di controllo è la parte più interessante di Direct Input. In Direct Input è possibile creare un sistema per la gestione di tutti i tipi di Joypad, volanti e qualsiasi diavoleria voi possediate. Potete inoltre controllare molti joypad contemporaneamente e la cosa risulta utile per giochi multiplayer. L'utilità non finisce qui dato che alcuni tipi di mouse potrebbero necessitare un controllo più preciso. Insomma la cosa si fa interessante.
Dato che non si sà cosa si ha attaccato al computer occorre interrogarlo per sapere se un determinato tipo di periferica esiste.
Questo è possibile con un ciclo di enumerazione

Dim periferica As DeviceInstance
For Each periferica In DirectInput.Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)
Next

Tramite l'oggetto periferica controlliamo la collezione generata da DirectInput.Manager.GetDevices.
Le opzioni che gli andremo a dare determineranno il tipo di periferica che lui cercherà. Ad esempio

DeviceClass.GameControl

specifica che cerchiamo una qualsiasi periferica di gioco (joypad, volanti ecc..). Se volete essere ancora più precisi usate

DeviceType.*

Ad esempio
DeviceType.Gamepad :solo gamepad
DeviceType.Driving :solo volanti
La seconda opzione indica che vogliamo che la periferica sia attiva (magari il joypad è staccato o spento).
La cosa che ci interessa è la guida

periferica.InstanceGuid

Se avete visto per creare tastiera e mouse gli passavamo una guida; ogni periferica ha una sua guida e quando ne troviamo una possiamo usarla per creare il device. Alla prima quindi creiamo un device.

Public joy1 As Device
joy1 = New DirectInput.Device(periferica.InstanceGuid)
joy1.SetDataFormat(DeviceDataFormat.Joystick)
joy1.SetCooperativeLevel(fhWnd, CooperativeLevelFlags.Background Or CooperativeLevelFlags.NonExclusive)

Questo processo come vedete è uguale a quello per tastiere e mouse.
Quello che noi andiamo ad usare è comunque una periferica che dobbiamo settare in modo più definito.
La cosa principale da settare è il range. Per range si intende il valore che deve avere la leva del joypad quando è alla massima estenzione. Questo significa che un gamepad assumerà quel valore quando la croce direzionale è premuta ma per volanti, joystick e tasti analogici il valore aumenterà gradatamente con la pressione. Per settare il valore è sufficiente questo ciclo

Dim d As DeviceObjectInstance
For Each d In joy1.Objects
If (d.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) <> 0 Then
joy1.Properties.SetRange(ParameterHow.ById, d.ObjectId, New InputRange(-5000, 5000))
End If
Next

Con questo ciclo enumeriamo le parti della periferica e se il tipo corrisponde ad un'asse ne impostiamo il range. Nel mio esempio ho impostato il minimo a -5000 ed il massimo a +5000. Questo significa che quando la leva X varrà 0 si troverà al centro mentre a -5000 a sinistra e a +5000 a destra.
Dato però che un joypad non è mai perfettamente calibrato spesso il centro non sarà proprio 0 ed il massimo non raggiungerà il valore specificato.
Finalmente possiamo attivare il joystick

joy1.Acquire()

Il sistema è un pò più complesso ma se andrete a vedere l'esempio sarà tutto più chiaro.
Ora dobbiamo interrogare la periferica
Dichiarate un oggetto adatto

Dim tasti As DirectInput.JoystickState

ed eseguite queste 2 istruzioni

joy1.Poll()
tasti = joy1.CurrentJoystickState

Poll serve ad aggiornare la periferica mentre la seconda copia la situazione dei tasti nell'oggetto
Ora sfogliando l'oggetto vedrete la situazione della periferica
Le cose sono veramente molte
GetButtons(n) : stato del tasto numero n, se 0 non è premuto, se > 0 si
X,Y,Z :stato degli assi (i valori sono compresi nel range)
Rx,Ry,Rz :rotazione angolare per quell'asse
Vx,Vy,Vz,VRx,VRy,VRz : velocità angolare o normale per l'asse
Ax,Ay,Az,ARx,ARy,ARz : velocità angolare o normale per l'asse
GetPointOfView :punto di veista in centesimi di grado
GetSlider(n) : per joypad con molti assi potete usare questi (in questo modo potete ottenere anche quelli diagonali se ci sono).
Notate bene che non tutti i joypad hanno tutte le proprietà e se interrogati daranno comunque zero per quei campi ma non creeranno problemi.
Potete creare più joypad creando diversi device con guide diverse senza alcun limite (anche 100 se ci riuscite ad attaccarle dietro al computer).


Vi lascio agli esempi che vi chiariranno ogni dubbio.

Esempio VB.Net

Esempio C#