|
DirectInput
- Tastatur |
|
Nun aber endlich die Verwaltung von
Eingabeinformationen, und als Erstes zu den Tastatureingaben. Diese sind
recht einfach zu verwalten da ja jeder Computer über
eine Tastatur verfügt und daher eine Auflistung
der vorhandenen Eingabegeräte nicht notwendig
ist. Dazu bietet DirectInput ein Standard-Datenformat
an.
|
Es
gibt drei Möglichkeiten um Tastatureingaben abzufragen:
-
über eine Schleife alle Tasten abfragen ob
eine gedrückt wurde
-
in der Spielschleife nur die gewünschten
Tasten abfragen ob sie gedrückt wurden
-
auf
ein DirectXEvent warten und dann erst die gewünschten
Tasten abfragen
|
Zunächst braucht man ein
DirectInputDevice-Objekt, das über das DirectInput-Objekt
und der Funktion CreateDevice() erstellt wird. Die Tastatur
ist ein Systemeingabegerät und es kann die
System-GUID
der Tastatur "GUID_SysKeyboard" verwendet
werden.
|
|
|
Set
diDEV = DI.CreateDevice("GUID_SysKeyboard") |
|
|
Mit dem
nun erstellten DirectInputDevice-Objekt kann mit der
Funktion SetCommonDataFormat() das Standarddatenformat
(DIFORMAT_KEYBOARD) der Tastatur gesetzt werden.
|
|
|
diDEV.SetCommonDataFormat DIFORMAT_KEYBOARD |
|
|
Nun muss nur noch der CooperativeLevel gesetzt
werden, damit DirectInput weis wie es das Gerät
mit anderen Anwendungen bzw. dem Windows zu teilen
hat. Dies geschieht mittels der Funktion SetCooperativeLevel()
vom DirectInputDevice-Objekt. Übergeben wird
der Handle des Hauptfensters der Anwendung und der
Flag für den CooperativeLevel. (siehe CooperativeLevel
und Datenformat)
|
|
|
diDEV.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or _ DISCL_NONEXCLUSIVE
|
|
|
Jetzt muss das Eingabegerät, in unserem Fall
die Tastatur, für unsere Anwendung reserviert werden.
Hiefür wird die Funktion Acquire vom DirectInputDevice-Objekt
verwendet.
|
|
|
diDEV.Acquire
|
|
|
Die
Verbindung zur Tastatur steht und die Eingabeinformationen
können verarbeitet werden. Zu beachten sei noch
das die Tastatur immer den exakten Status liefert.
Also ob ein oder mehrere Tasten gedrückt (ein)
oder nicht gedrückt sind (aus). Diesen exakten
Status erhält man über den Typ DIKEYBOARDSTATE
und der Funktion GetDeviceStateKeyboard vom DirectInputDevice-Objekt.
|
|
|
Dim diState As DIKEYBOARDSTATE
diDEV.Acquire diDEV.GetDeviceStateKeyboard diState
|
|
|
Die
Abfrage der Tastatureingaben über eine Schleife
ist die einfachste Möglichkeit. Es wird nur eine
ForNext-Schleife über alle 256 Tasten benötigt.
Diese Variante ist aber bei Spielen nicht sehr empfehlenswert,
da immer alle Tasten überprüft werden obwohl
vielleicht gar keine gedrückt wurde.
|
|
|
For iKeyCounter = 0 To 255
If diState.Key(iKeyCounter) <> 0 Then
lstKeys.AddItem iKeyCounter & " wurde gedrückt", 0
End If
Next
|
|
|
Nur
die gewünschten Tasten in der Spielschleife abzufragen
ist auch recht einfach. Hat aber den gleichen Nachteil
wie die Abfrage aller Tasten über eine Schleife.
Es wird bei jedem Durchlauf auf Tastatureingaben geprüft
obwohl vielleicht gar keine Informationen vorliegen.
|
|
|
If diState.Key(DIK_A) <> 0 Then
'tu dies
Else
'tu das
End If
|
|
|
Eine
Möglichkeit, die die Ressourcen am Wenigsten
beansprucht ist, auf
ein DirectXEvent zu warten, um dann erst die gewünschten
Tasten abzufragen, da die Tastatureingaben nur dann überprüft
werden, wenn auch wirklich Informationen vorliegen.
Hierbei muss aber ein DirectXEvent erstellt werden
und die Prozedur DirectXEvent_DXCallback(ByVal eventid
As Long) im Hauptfenster der Anwendung vorhanden sein.
|
|
|
Implements DirectXEvent
Dim DXEvent As
Long
DXEvent = DirectX.CreateEvent(Me)
DDevice.SetEventNotification EventHandle
Private Sub DirectXEvent_DXCallback(ByVal eventid As Long)
'Diese Prozedur wird automatisch von DirectX aufgerufen,
'wenn etwas geändert wird.
On Local Error Resume Next
If diDEV Is Nothing Then Exit Sub
diDEV.GetDeviceStateKeyboard diState
If Err.Number = DIERR_NOTACQUIRED Then
diDEV.Acquire
End sub
|
|
|
Zu beachten ist hier auch noch, dass bei Verwendung
von mehreren DXEvents (z.B. wenn Wave-Dateien
gestreamt werden) die Event-ID abgefragt wird. Da
ansonsten die Tastatureingaben überprüft werden
obwohl gar kein Ereignis von DirectInput vorliegt.
|
Wird
die Anwendung beendet, so sollten die Objekte und
das Eingabegerät wieder freigegeben werden. Mit
der Funktion Unacquire vom DirectInputDevice-Objekt
wird das Eingabegerät wieder freigegeben. Das
DirectInput-Objekt kann einfach auf Nothing gesetzt
werden.
|
|
|
DirectX.DestroyEvent
EventHandle
diDEV.Unacquire
Set DI = Nothing
|
|
|
Die gedrückte Taste abzufragen ist sehr einfach; wie
Visual Basic bietet DirectInput ein komplettes Set von Konstanten um
die Nummern der Tasten zu ersetzen. Entweder man benutzt
die jeweiligen Konstanten (dadurch wird der Quellcode
übersichtlicher) oder man fragt die Nummern der Tasten
ab. Die nachfolgende Liste zeigt alle Konstanten.
Diese Liste ist auch im Objekt-Browser von VB (F2-Taste
drücken) unter der DirectX Library zu finden.
DIK_A
DIK_B
DIK_C
DIK_D
DIK_E
DIK_F
DIK_G
DIK_H
DIK_I
DIK_J
DIK_K
DIK_L
DIK_M
DIK_N
DIK_O
DIK_P
DIK_Q
DIK_R
DIK_S
DIK_T
DIK_U
DIK_V
DIK_W
DIK_X
DIK_Y
DIK_Z
DIK_1 Auf der Haupttastatur
DIK_2 Auf der Haupttastatur
DIK_3 Auf der Haupttastatur
DIK_4 Auf der Haupttastatur
DIK_5 Auf der Haupttastatur
DIK_6 Auf der Haupttastatur
DIK_7 Auf der Haupttastatur
DIK_8 Auf der Haupttastatur
DIK_9 Auf der Haupttastatur
DIK_0 Auf der Haupttastatur
DIK_F1
DIK_F2
DIK_F3
DIK_F4
DIK_F5
DIK_F6
DIK_F7
DIK_F8
DIK_F9
DIK_F10
DIK_F11
DIK_F12
DIK_F13
DIK_F14
DIK_F15
DIK_NUMPAD0
DIK_NUMPAD1
DIK_NUMPAD2
DIK_NUMPAD3
DIK_NUMPAD4
DIK_NUMPAD5
DIK_NUMPAD6
DIK_NUMPAD7
DIK_NUMPAD8
DIK_NUMPAD9
DIK_ESCAPE
DIK_MINUS Auf der Haupttastatur
DIK_EQUALS Auf der Haupttastatur
DIK_BACK BackSpace
DIK_TAB
DIK_LBRACKET [
DIK_RBRACKET ]
DIK_RETURN Auf der Haupttastatur
DIK_LCONTROL linke Strg-Taste
DIK_SEMICOLON
DIK_APOSTROPHE
DIK_GRAVE (`)
DIK_LSHIFT linke Shift-Taste
DIK_BACKSLASH
DIK_COMMA
DIK_PERIOD Auf der Haupttastatur
DIK_SLASH Forward slash (/)Auf der Haupttastatur
DIK_RSHIFT rechte Shift-Taste
DIK_MULTIPLY * auf Nummernblock
DIK_LMENU linke Alt-Taste
DIK_SPACE Space-Taste
DIK_CAPITAL Caps Lock
DIK_NUMLOCK
DIK_SCROLL Scroll Lock
DIK_SUBTRACT - auf Nummernblock
DIK_ADD + auf Nummernblock
DIK_DECIMAL . auf Nummernblock
DIK_NUMPADENTER
DIK_RCONTROL rechte Strg-Taste
DIK_NUMPADCOMMA Komma auf NEC PC98 Nummernblock
DIK_DIVIDE Forward slash (/)auf Nummernblock
DIK_SYSRQ
DIK_RMENU rechte Alt-Taste
DIK_HOME
DIK_UP Pfeiltaste oben
DIK_PRIOR Bild auf
DIK_LEFT Pfeiltaste links
DIK_RIGHT Pfeiltaste rechts
DIK_END
DIK_DOWN Pfeiltaste unten
DIK_NEXT Bild ab
DIK_INSERT
DIK_DELETE
DIK_LWIN linke Windows-Taste
DIK_RWIN rechte Windows-Taste
DIK_APPS Anwendungs-Taste
DIK_PAUSE
|
|
Ein
Beispiel für die Verwaltung von Tastatureingaben
können Sie hier downloaden.
|
|
|
Download
tip0043.zip
(13,1 kB) |
|
Downloads
bisher: [ 3180
] |
|