Alternative Joystick-Abfrage

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

 

BadDeath

Betreff: Alternative Joystick-Abfrage

BeitragDi, Mai 12, 2009 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab hier eine kleine Funktion für euch, die die Joystick-Befehle von BB nachmacht. Der Grund dafür war, dass die Blitz-eigenen Befehle dazu nur funktionieren, wenn das Fenster von Blitz auch aktiv ist, also den Fokus besitzt. Die 3 Achsen sind dabei ebenfalls im Bereich von -1.0 bis 1.0. Ist kein Joystick unter dem angegebenen Port angeschlossen, gibt die Funktion '0' zurück.

Code: [AUSKLAPPEN]
; Type zum Datenfüttern
Type JoyInfo
   Field tmp_X, tmp_Y, tmp_Z
   Field Buttons, tmp_Buttons
   Field X#, Y#, Z#
End Type

; globale Instanz des Types, Zeit der letzten Aktualisierung und Array für bis zu 12 Buttons
Global Joystick.JoyInfo = New JoyInfo, LastUpdateJoy, JoyStickDown[12]

; die eigentliche Funktion
Function Joystick(Intervall = 10, Port = 0)
   ; nur nach vorgegebenen Intervall updaten
   If MilliSecs() - LastUpdateJoy >= Intervall Then
      ; Daten mit der API in den Type schreiben
      Ret = api_joyGetPos(Port, Joystick)
      
      ; wenn Daten empfangen wurden, folgt die Auswertung
      If Ret = 0 Then
         ; Koordinaten wie bei BB in den Bereich von -1.0 bis 1.0
         Joystick\tmp_X = Joystick\tmp_X - 32767
         Joystick\tmp_Z = Joystick\tmp_Z - 32767      
         Joystick\tmp_Y = Joystick\tmp_Y - 32767
         
         ; bei mir trat hier ab und an eine Toleranz auf ^^
         If Joystick\tmp_X = 1 Then Joystick\tmp_X = 0
         If Joystick\tmp_Y = 1 Then Joystick\tmp_Y = 0      
         If Joystick\tmp_Z = 1 Then Joystick\tmp_Z = 0
         
         Joystick\X = Float(Joystick\tmp_X) / 32767
         Joystick\Y = Float(Joystick\tmp_Y) / 32767
         Joystick\Z = Float(Joystick\tmp_Z) / 32767      
   
         If Joystick\X > 1 Then Joystick\X = 1
         If Joystick\Y > 1 Then Joystick\Y = 1      
         If Joystick\Z > 1 Then Joystick\Z = 1
         
         ; die Buttons werden in 2er-Potenzen angegeben und hier ausgewertet
         ; ist der Button gedrückt, ist der jeweilige Wert im Array '1'
         Joystick\tmp_Buttons = Joystick\Buttons
         For i = 11 To 0 Step -1
            JoyStickDown[i+1] = 0
            If Joystick\tmp_Buttons >= (1 Shl i) Then
               JoyStickDown[I+1] = 1
               Joystick\tmp_Buttons = Joystick\tmp_Buttons - (1 Shl i)
            End If
         Next
         
         LastUpdateJoy = MilliSecs()         
      Else
         ; kein Joystick angeschlossen
         Return 0
      End If
   End If
   
   Return 1
End Function


Hier noch ein kleines Beispiel:

Code: [AUSKLAPPEN]
Graphics 400,400,0,2

Type JoyInfo
   Field tmp_X, tmp_Y, tmp_Z
   Field Buttons, tmp_Buttons
   Field X#, Y#, Z#
End Type


Global Joystick.JoyInfo = New JoyInfo, LastUpdateJoy, JoyStickDown[12], Zeit

While Not KeyHit(1)
   Cls
   
   Zeit = MilliSecs()
      
   If Joystick(100,0) = 0 Then
      If Joystick(100,1) = 0 Then
         RuntimeError "Kein Joystick angeschlossen!"
      End If
   End If
   
   Text 0,00, "X: " + Joystick\X
   Text 0,20, "Y: " + Joystick\Y
   Text 0,40, "Z: " + Joystick\Z
   Text 0,60, "Buttons: " + Joystick\Buttons
   
   For i = 1 To 12
      Text 0,70+i*20, "Button " + i + ": " + JoyStickDown[i]
   Next   
   
   Flip 0
Wend
End

; Alternative Joystick-Abfrage
Function Joystick(Intervall = 10, Port = 0)
   If Zeit - LastUpdateJoy >= Intervall Then
      Ret = api_joyGetPos(Port, Joystick)
   
      If Ret = 0 Then
         Joystick\tmp_X = Joystick\tmp_X - 32767
         Joystick\tmp_Z = Joystick\tmp_Z - 32767      
         Joystick\tmp_Y = Joystick\tmp_Y - 32767
               
         If Joystick\tmp_X = 1 Then Joystick\tmp_X = 0
         If Joystick\tmp_Y = 1 Then Joystick\tmp_Y = 0      
         If Joystick\tmp_Z = 1 Then Joystick\tmp_Z = 0
         
         Joystick\X = Float(Joystick\tmp_X) / 32767
         Joystick\Y = Float(Joystick\tmp_Y) / 32767
         Joystick\Z = Float(Joystick\tmp_Z) / 32767      
   
         If Joystick\X > 1 Then Joystick\X = 1
         If Joystick\Y > 1 Then Joystick\Y = 1      
         If Joystick\Z > 1 Then Joystick\Z = 1
         
         Joystick\tmp_Buttons = Joystick\Buttons
         For i = 11 To 0 Step -1
            JoyStickDown[i+1] = 0
            If Joystick\tmp_Buttons >= (1 Shl i) Then
               JoyStickDown[I+1] = 1
               Joystick\tmp_Buttons = Joystick\tmp_Buttons - (1 Shl i)
            End If
         Next
                  
         LastUpdateJoy = Zeit         
      Else
         Return 0
      End If
   End If
   
   Return 1
End Function


Und noch die Userlib:
Code: [AUSKLAPPEN]
.lib "WinMM.dll"
api_joyGetPos%(ID%, pji*) : "joyGetPos"


Danke nochmal an Noobody bei der Hilfe zu den Buttons Very Happy
-~= real coders just code in binary =~-
  • Zuletzt bearbeitet von BadDeath am Di, Mai 12, 2009 22:53, insgesamt einmal bearbeitet

Eingeproggt

BeitragDi, Mai 12, 2009 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf die Gefahr hin, dass ich was Blödes sag:

Globale Var:
Code: [AUSKLAPPEN]
Global LastUpdate ;[...]


und in der Funktion:
Code: [AUSKLAPPEN]
If MilliSecs() - LastUpdateJoy >= Intervall Then


Fällt dir da was auf? LastUpdate<>LastUpdateJoy?
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

The_Nici

BeitragDi, Mai 12, 2009 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich liebe dich!
genau das, was ich gesucht habe!
Dankedankedanke XD
MfG
 

BadDeath

BeitragDi, Mai 12, 2009 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Eingeproggt hat Folgendes geschrieben:
Auf die Gefahr hin, dass ich was Blödes sag:

Globale Var:
Code: [AUSKLAPPEN]
Global LastUpdate ;[...]


und in der Funktion:
Code: [AUSKLAPPEN]
If MilliSecs() - LastUpdateJoy >= Intervall Then


Fällt dir da was auf? LastUpdate<>LastUpdateJoy?


Ganz im Gegenteil - es eher was Schlaues. Danke, hatte ich wohl übersehen, als ich ein paar Variablen umbennante, um es übersichtlicher zu gestalten. Embarassed

@ Nici: Freut mich, wenn ich helfen konnte!
-~= real coders just code in binary =~-

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group