DirectInput - Maus  

Die Verwaltung der Maus über DirectInput ist genauso einfach wie die der Tastatur. Die Maus ist auch ein Systemeingabegerät und man kann davon ausgehen das an jedem Computer eine Maus (egal welcher Art) angeschlossen ist.

Eine Auflistung der vorhandenen Eingabegeräte ist daher nicht notwendig. Weiterhin gibt es ein Standard-Datenformat welches uns DirectInput anbietet. Im Gegensatz zu den Tastaturinformationen liefert die Maus relative Eingabeinformationen.

Es gibt zwei Möglichkeiten um Mauseingaben abzufragen:

  • in der Spielschleife die Eingabeinformationen abfragen

  • auf ein DirectXEvent warten und dann erst die Eingabeinformationen verarbeiten

Doch zunächst braucht man ein DirectInputDevice-Objekt, das über das DirectInput-Objekt und der Funktion CreateDevice erstellt wird. Da die Maus ein Systemeingabegerät ist, wird die System-GUID der Maus "GUID_SysMouse" verwendet.

Set DIDEV = DI.CreateDevice("GUID_SysMouse")

Mit dem nun erstellten DirectInputDevice-Objekt kann mit der Funktion SetCommonDataFormat das Standarddatenformat (DIFORMAT_MOUSE) der Maus gesetzt werden.

DIDEV.SetCommonDataFormat DIFORMAT_MOUSE

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.

Im Gegensatz zu der Tastatur kann die Maus auf Vordergrund und Exklusiv gesetzt werden, aber nur solange die Anwendung auch wirklich im Vordergrund ist.

DIDEV.SetCooperativeLevel Me.hWnd, DISCL_FOREGROUND Or _
  DISCL_EXCLUSIVE

Jetzt muss das Eingabegerät, in unserem Fall die Maus, für unsere Anwendung reserviert werden. Hiefür wird die Funktion Acquire vom DirectInputDevice-Objekt verwendet.

DIDEV.Acquire

Die Verbindung zur Maus besteht nun, und die Eingabeinformationen können verarbeitet werden. Zu beachten sei noch das die Maus relative Daten liefert. Also nicht die neue Position sondern den Abstand von der alten Position. Die Mausdaten erhält man über den Typ DIMOUSESTATE und der Funktion GetDeviceStateMouse vom DirectInputDevice-Objekt.

Dim MouseState As DIMOUSESTATE
DIDEV.GetDeviceStateMouse MouseState

Wird bei einem Spiel hauptsächlich die Maus benutzt, z.B. beim einem EgoShooter, dann ist es sinnvoll die Mausdaten in der Hauptschleife des Spieles zu verarbeiten.

 'gesicherte Mausposition im Spiel
Type strcPoint
  x  As Long
  y  As Long
End Type
Dim MousePoint As strcPoint

 'Geschwindigkeit der Maus

Const MouseSpeed = 2

  'Verarbeitung der Mausdaten in der Schleife
DIDEV.GetDeviceStateMouse MouseState
With MouseKor
  .x = .x + MouseState.x * MouseSpeed
  .y = .y + MouseState.y * MouseSpeed
  If MouseState.buttons(0) <> 0 Then
    'linke Maustaste gedrückt
  Else
    'nicht gedrückt
  End If
  If MouseState.buttons(1) <> 0 Then
  'rechte Maustaste gedrückt
  Else
    'nicht gedrückt
  End If
End With

Eine Möglichkeit, die die Ressourcen am Wenigsten beansprucht ist, auf ein DirectXEvent zu warten, um dann erst die Mausdaten zu verarbeiten. Das ist z.B. bei einem Solitär-ähnlichem Kartenspiel sehr sinnvoll. Dazu muss ein DirectXEvent erstellt werden und die Prozedur DirectXEvent_DXCallback im Hauptfenster der Anwendung vorhanden sein.

Zu beachten ist hier, dass bei Verwendung von mehreren DXEvents (z.B. wenn Wave-Dateien gestreamt werden) die Event-ID abgefragt wird, da ansonsten die Mausdaten verarbeitet werden obwohl gar kein Ereignis von DirectInput vorliegt.

Wird die Anwendung beendet, dann sollten die Objekte und das Eingabegerät wieder freigegeben werden. Dies geschieht mit der Funktion Unacquire vom DirectInputDevice-Objekt, wobei das DirectInput-Objekt einfach auf Nothing gesetzt werden kann 

DIDEV.Unacquire
Set DI = Nothing

Ein Beispiel für die Verwaltung von Mausdaten können Sie hier downloaden.

  Download BitmapBlt.zip Download
tip0042.zip
 (14,1 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 2526 ]

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, Dienstag, 7. Mai 2002