|
DirectInput
- Grundlagen |
|
Über die Win32 API wurden vor DirectX
alle Benutzereingaben ausgelesen. Trotz ihrer kompletten
Unterstützung der Eingaben über Tastatur
und Maus reichte sie für die schnelle Eingaben, die für
heutige Spiele erforderlich sind nicht mehr aus. Als Spieler möchte
man ja, dass seine
Figur sofort reagiert, wenn er z.B. den Joystick bewegt,
und nicht erst, wenn er das Spiel verloren hat. Microsoft
erkannte die Notwendigkeit einer Schnittstelle mit
geringer Latenz (Verzögerung), um mit den vorhandenen
schnellen Grafik-, Netzwerk- und Sound-Features mithalten
zu können.
|
Und
genau aus diesem Grund gibt es DirectInput, um Benutzereingaben mit extrem geringer Latenz zu
bieten. Dadurch fühlen sich die Spiele reaktionsfreudiger
an und das ist genau das, was Spieler von einem Spiel
erwarten.
|
DirectInput
umgeht den Ebenen-Ansatz der Win32Api und kommuniziert
direkt mit den Gerätetreibern der Eingabegeräte.
Durch diese vielseitige Schnittstelle unterstützt
DirectInput alle Eingabegeräte die es
z.Zt. gibt oder noch zukünftig geben wird.
|
Dazu
unterscheidet DirectInput drei Arten von
Eingabegeräten:
-
Tastatur
-
Maus oder ähnliche Geräte wie Touchpad oder
Trackball
-
Joystick
sowie alle übrigen Geräte wie Gamepad, Lenkrad
usw.
|
Egal ob
Flightsticks,
Joysticks mit mehr als 2 Achsen oder
Force-Feedback-Geräte, durch die freie und
offene Schnittstelle unterstützt
DirectInput alle Eingabegeräte, auch
zukünftige. Auch wenn Sie in ihrer Garage ein Formel1-Cockpit
als Eingabegerät umgebaut haben, können Sie
davon ausgehen, dass es von DirectInput unterstützt
wird.
|
DirectInput
besteht aus drei wichtigen Objekten:
-
DirectInput
-
DirectInputDevice
-
DirectInputEffects
Das
DirectInput-Objekt ist das Herzstück von DirectInput
und es können hierüber alle DI-Geräte
aufgelistet und verwendet werden. Jedes Eingabegerät wird von einem
DirectInputDevice-Objekt repräsentiert, egal wie viele Eingabegeräte in einem Spiel verwendet
werden. Es gibt immer ein DirectInputDevice-Objekt
pro Eingabegerät. Für Effekte von Force-Feedback-Geräten
ist das DirectInputEffect-Objekt zuständig.
|
Wichtig
sei noch zu erwähnen das man die Objekte wieder
freigibt, wenn man sie nicht mehr benötigt. Am
einfachsten ist es, das Objekt auf Nothing zu setzen.
|
Das
DirectInput-Objekt
|
Mit
diesem Objekt erhält man Zugriff auf die verfügbaren
Eingabegeräte und Funktionen, um diese Eingabegeräte
zu erkennen. Dieses Objekt wird für das Erstellen von DirectInputDevice-Objekten
hauptsächlich verwendet, und es bietet auch noch andere, wichtige
Funktionen.
Das
Objekt wird über ein aktives DirectX-Objekt und
der DirectInputCreate()-Funktion erstellt.
|
|
 |
Dim DX As New DirectX7
Dim DI As DirectInput
'erstelle das DirectInput-Objekt
Set DI = DX.DirectInputCreate()
|
 |
|
Die wichtigste
Funktion ist CreateDevice(), die ein DirectInputDevice-Objekt
für ein angeschlossenes physisches Eingabegerät
erzeugt. Zum Beispiel für die Tastatur und für
die Maus.
|
|
 |
'DirectInputDevice für Tastatur
Dim DIDKeyboard As DirectInputDevice
Set DIDKeyboard = DI.CreateDevice("GUID_SysKeyboard")
'DirectInputDevice für Maus
Dim DIDMouse As DirectInputDevice
Set DIDMouse = DI.CreateDevice("GUID_SysMouse")
|
 |
|
Es kann
aber nicht davon ausgegangen werden das jedes gewünschte
Eingabegerät am Computer angeschlossen ist.
Mit Sicherheit verfügt der Computer über
eine Tastatur und über eine Maus. Aber bei einem
Joystick sieht das schon anders aus. Da der Versuch
ein DirectInputDevice-Objekt für ein nicht angeschlossenes
Eingabegerät zu erzeugen, mit einem Fehler
quittiert wird, sollten die verfügbaren Eingabegeräte
vorher eingelesen werden, um festzustellen, welche nun
auch tatsächlich angeschlossen und installiert
sind.
|
Einlesen
aller verfügbaren Geräte
|
Anders
als bei DirectDraw oder Direct3D können
Eingabegeräte von DirectX nicht simuliert
werden, und daher ist es wichtig, vorher festzustellen
welche Geräte z.Zt. am Computer verfügbar sind.
|
Hierbei gibt es mehrere Möglichkeiten
indem wir eine Liste aller I/O-Geräte erhalten können,
die unter Windows registriert aber nicht unbedingt zur gleichen Zeit
angeschlossen sind, oder eine Liste der z.Zt. angeschlossenen
Geräte und/oder nur vom Typ Joystick sind.
|
Um ein
solche Liste zu erstellen und die gewünschten
Informationen einlesen zu können, brauchen wir
noch ein weiteres Objekt - DirectInputEnumDevices.
|
Mit der
Funktion: GetDIEnumDevices (deviceType As CONST_DIDEVICETYPE,
flags As CONST_DIENUMDEVICESFLAGS) wird die Liste der
verfügbaren Geräte erzeugt.
|
deviceType ist ein Typ-Filter:
|
0
|
Mit 0 erhält man alle Eingabegeräte
|
DIDEVTYPE_KEYBOARD
|
Tastaturen
|
DIDEVTYPE_MOUSE
|
Mäuse
aller Art inkl. TouchPad und TrackBall
|
DIDEVTYPE_JOYSTICK
|
Joysticks
aller Art
inkl. Steuerrad
|
DIDEVTYPE_DEVICE
|
Eingabegeräte,
die nicht in die vorher genannten Kategorien fallen.
|
|
|
flags legt fest
welche I/O-Geräte aufgelistet werden:
|
DIEDFL_ALLDEVICES
|
Alle Geräte (Standard)
|
DIEDFL_ATTACHEDONLY
|
Nur angeschlossene und installierte Geräte
|
DIEDFL_FORCEFEEDBACK
|
Nur Force Feedback-Geräte
|
DIEDFL_INCLUDEALIASES
|
Geräte, die als
Platzhalter für andere Geräte dienen
|
DIEDFL_INCLUDEPHANTOMS
|
Phantomgeräte (Platzhalter)
|
|
 |
Dim DIED As DirectInputEnumDevices
'einlesen aller Eingabegeräte
Set DIED = DI.GetDIEnumDevices(0, DIEDFL_INCLUDEPHANTOMS)
'einlesen nur der z.Zt. angeschlossenen
Set DIED = DI.GetDIEnumDevices(0, DIEDFL_ATTACHEDONLY)
|
 |
|
Mit
dem Objekt DirectInputEnumDevices kann die Anzahl
der Eingabegeräte festgestellt werden. Weiterhin
sind auch Informationen über das jeweilige Geräte
verfügbar.
|
Mit der
Funktion GetCount() erhält man die Anzahl
der Geräte und mit GetItem(Index) die
Informationen wie z.B. Produktname oder GUIDInstanz.
|
|
 |
'die ProduktNamen aller Geräte werden in einer ListBox angezeigt
With lst_DID
.Clear
For i = 1 To DIED.GetCount
.AddItem DIED.GetItem(i).GetProductName
Next
.ListIndex = 0
End With
|
 |
|
Über
das DirectInput-Objekt ist es auch möglich die
Systemsteuerung zu öffnen.
|
|
 |
'Systemsteuerungs-Fenster öffnen
DI.RunControlPanel Me.hWnd
|
 |
|
Ein
Beispiel für das Einlesen aller verfügbaren
Eingabegeräte können Sie hier downloaden.
|
|
|
Download
tip0230.zip
(8,5 kB) |
 |
Downloads
bisher: [ 1965
] |
|
|