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#
I commenti sono disabilitati.