Für manche Anwendungen (z.B. Spiele oder computergesteuerten Geräte) wäre es schön, die Steuerung über einen angeschlossenen Joystick vorzunehmen. Wie funktioniert das?
Prinzipiell kann man alle Ports eines Computers (LPT, USB, ...) mit der inpout32.dll setzen und abfragen. Beim Gameport(Joystickanschluss!) ist das System aber nicht einfach nach "Eingang offen", "Eingang zu" geregelt, sondern etwas durchdachter aufgebaut. Ein Kondensator wird über den Widerstand im Joystick (Potentiometer an X- und Y-Achsen) geladen, was zu unterschiedlichen Ladezeiten führt. Langer Rede kurzer Sinn: man durchläuft eine Schleife, und zähl mit, wie lange es dauert bis der Eingang auf 1 ist. Option Explicit ' Zunächst die benötigten Deklarationen Private Declare Function Inp Lib "inpout32.dll" _ Alias "Inp32" ( _ ByVal PortAddress As Integer) As Integer Private Declare Sub Out Lib "inpout32.dll" _ Alias "Out32" ( _ ByVal PortAddress As Integer, _ ByVal Value As Integer) ' Der Gameport Private Const InpJoy As Integer = &H201 Da die oben erwähnten Abfragen in Millisekunden erfolgen, werden die Werte meist ungenau. Ab 50 - 100 Messungen, erhält man aber ziemlich genaue Durchschnittswerte. Public Function JoyX() As Integer Dim maxmess As Integer Dim i(100) As Long Dim z As Integer Dim a As Long ' Die Schleife wird öfters durchlaufen ' um ein besseres Ergebnis zu erzielen For z = 0 To 100 ' Der Eingang am Gameport (&H201) ' wird auf 0 zurückgesetzt Out InpJoy, 0 i(z) = 0 Do ' Je länger es dauert, desto größer ist der ' Widerstand, und somit die Neigung des Joysticks i(z) = i(z) + 1 ' Wenn kein Gerät angeschlossen ist, würde ' man hier in eine Endlosschleife geraten. Desshalb ' wird nach 255 Versuchen abgebrochen Loop Until (Inp(InpJoy) And 1) = 0 Or i(z) > 255 ' Von den 100 Messwerten wird der Durchschnitt genommen a = a + i(z) Next z JoyX = Int(a / 100) End Function Das gleiche natürlich auch für die Y-Achse: Public Function JoyY() As Integer Dim i(100) As Long Dim z As Integer Dim a As Long For z = 0 To 100 Out InpJoy, 0 i(z) = 0 Do i(z) = i(z) + 1 Loop Until (Inp(InpJoy) And 2) = 0 Or i(z) = 255 a = a + i(z) Next z JoyY = Int(a / 100) End Function Den Status der Tasten zu ermitteln ist hingen viel einfacher, da diese jeweils einen fixen Pin belegen. Public Function TasteGedrueckt(TastNr As Integer) As Boolean Dim Value As Integer Dim i As Integer Value = Inp(InpJoy) ' Das Eingangsignal des Gameports wird ' hier in seine einzelnen Pins zerlegt For i = 7 To 4 Step -1 If Value >= 2 ^ i Then Value = Value - 2 ^ i If TastNr = i - 3 Then TasteGedrueckt = False End If Else If TastNr = i - 3 Then TasteGedrueckt = True End If End If Next i End Function Das Ganze könnte in einer Anwendung dann ungefähr so aussehen: Private Sub Timer1_Timer() Label1.Caption = "X: " & JoyX & " Y: " & JoyY Label2.Caption = "Taste1 gedrückt: " & TasteGedrueckt(1) Label3.Caption = "Taste2 gedrückt: " & TasteGedrueckt(2) Shape1.Left = JoyX * 10 Shape1.Top = JoyY * 10 End Sub Dieser Tipp wurde bereits 16.991 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |