\\ Home : Articoli : Stampa
DirectInput - Tastiera
Di RobyDx (del 09/08/2007 @ 11:06:17, in DirectX9, linkato 4779 volte)

DirectInput è la componente di DirectX responsabile della gestione degli input da periferiche esterne. Nonostante Visual Basic fornisca una gestione molto affidabile per la gestione di tastiera e mouse questa si rivela troppo lenta per affrontare "le fatiche" di un gioco in real time. Se ad esempio un gioco gira a 60 frame al secondo, anche gli input devono essere gestiti con la stessa frequenza ed è quindi necessaria un controllo più diretto. Inoltre Direct Input è l'unico modo per ottenere input da JoyStick, gamepad, volanti ed ogni altra periferica esistente. Capite quindi che Direct Input è fondamentale per un gioco. Usare Direct Input è molto semplice ed in DirectX 9 ancora di più. La prima periferica che andiamo ad analizzare sarà la tastiera del PC. Innanzitutto per usare Direct Input è necessario aggiungere i riferimenti alla libreria. Andate al menù progetto e da lì ad aggiungi riferimenti. Ora aggiungete

Microsoft.DirectX
Microsoft.DirectX.DirectInput

Aggiungete i relativi imports in ogni modulo per facilitare la gestione di DirectInput
La tastiera, come per le altre periferiche, viene gestita da un oggetto di tipo Device. State attenti che anche altri oggetti di DirectX si chiamano Device e per non confondere VB dichiarate gli oggetti come DirectInput.Device. Al momento dato che non importiamo altre librerie non ce ne sarà bisogno.
Dichiarate un oggetto device

Public tastiera As Device

e createlo

tastiera = New Device(SystemGuid.Keyboard)

L'oggetto SystemGuid serve a specificare che il Device è creato per la tastiera. Ora è necessario settarlo.

tastiera.SetDataFormat(DeviceDataFormat.Keyboard)

Con questa impostate il tipo di dati che dovrà emettere mentre con questa ne impostate il comportamento

tastiera.SetCooperativeLevel(fhWnd, CooperativeLevelFlags.Background Or CooperativeLevelFlags.NonExclusive)

fhwnd è un oggetto di tipo control che serve a specificare il form proprietario. Passategli quindi il form o un oggetto control posto uguale al form. Le due opzioni successive servono ad indicare che DirectX non prenderà il controllo esclusivo dell'applicazione e che lavorerà in background. Questo serve a far in modo che il programma non entri in conflitto con altre applicazioni. Per accellerare ulteriormente il processo ma rischiare di generare errori usate

fhWnd, CooperativeLevelFlags.Foreground Or CooperativeLevelFlags.Exclusive

Infine usate

tastiera.Acquire()

Per attivare la tastiera. Ora il device è pronto e può essere usato per chiedere input da tastiera. L'input non può essere gestito ad eventi (altrimenti non servirebbe a niente) quindi le istruzioni di acquisizione vanno inserite nel ciclo del gioco o in un oggetto timer. Per ottenere le info è sufficiente dichiarare un oggetto di tipo

dim tasti as KeyboardState

e porlo uguale a

tasti=tastiera.GetCurrentKeyboardState

Ora l'oggetto tasti contiene la situazione della tastiera in quell'istante. Per sapere se un tasto è premuto basta che sia vero l'oggetto per un determinato indice. Ad esempio se

tasti(Key.A) =true

Significa che il tasto A è premuto. Le costanti Key.* compaiono automaticamente e specificando il nome che vi serve potete determinare lo stato di quel preciso tasto. I nomi sono tutti molto chiari quindi non sarà necessaria alcuna spiegazione. Ricordate che possono essere premuti molti tasti contemporaneamente (fino al riempimento del buffer di memoria del computer per la tastiera) quindi non serve usare l'istruzione più volte. Ricordate infine che la situazione memorizzata vale solo per quell'istante e di conseguenza dovete aggiornare più spesso possibile; sembrano cose banali ma molti ci cascano.

 
Vi lascio agli esempi che chiariranno ogni cosa.

Esempio VB.Net

Esempio C#