|
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:
|
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
tip0042.zip
(14,1 kB) |
|
Downloads
bisher: [ 2526
] |
|