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 BitmapBlt.zip Download
tip0230.zip
 (8,5 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 1967 ]

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Samstag, 27. April 2002