Joystick et autres manettes de jeu (optimisé)

Contenu du snippet

Petit programme pour la gestion d'un ou plusieurs contrôleur de jeu...
- Position de tous les axes (jusqu'à 6)
- Position du bouton 'Point de vue' de 0 à 360°
- Etat des touches de la manette (jusqu'à 31)

- Affichage des valeurs dans Label1
- Affichage graphique dans Form1 (axes + boutons)

Faites tournez votre manette dans tous les sens et observez les positions limites de celle-ci ! (Pas toujours très obtimisé, les manettes du commerce...)

Source / Exemple :


' Objets à créer :
' ================
' Une feuille Form1 + Label1 + Timer1
' Un module Module1

' Dans Form1 :
' ============

Private Sub Form_Load()
  Form1.Caption = "Columbiad Software - Contrôleur de jeu"
  Form1.BackColor = vbWhite
  Form1.ScaleMode = vbPixels
  Form1.AutoRedraw = True
  Form1.Cls
  Form1.AutoRedraw = False
  
  Timer1.Interval = 10
  Timer1.Enabled = True
  
End Sub

Private Sub Timer1_Timer()
  Static C As Long
  
  Manette.dwSize = 64
  Manette.dwFlags = JOY_RETURN_ALL
  
 Call joyGetPosEx(0, Manette) ' Envoi toutes les informations du contrôleur n°0 dans "Manette"
'Call joyGetPosEx(1, Manette) ' Envoi toutes les informations du contrôleur n°1 dans "Manette"
'Call joyGetPosEx(2, Manette) ' Envoi toutes les informations du contrôleur n°2 dans "Manette"
'....
  
  Form1.Cls
  Form1.AutoRedraw = True
  ' Affichage des boutons :
  Form1.FillStyle = vbFSSolid
  Form1.DrawMode = vbCopyPen
  For i% = 0 To 15
    ' Teste chaque bouton
    If (Manette.dwButtons And (2 ^ i%)) > 0 Then
      C = vbGreen ' bouton appuyé
    Else
      C = vbRed ' bouton relaché
    End If
    Form1.FillColor = C: Form1.Circle (10 + 10 * i%, 10), 5, C
  Next i
  
  ' Affichage des axes:
  Form1.DrawMode = vbMaskNotPen
  Form1.FillStyle = vbFSSolid
  
  ' Axe 1 (violet) :
  C = RGB(0, 255, 0): Form1.FillColor = C
  Form1.Circle (10 + Manette.dwXpos, 30 + Manette.dwYpos), 3, C
  
  ' Axe 2 (bleu ciel) :
  C = RGB(255, 0, 0): Form1.FillColor = C
  Form1.Circle (10 + Manette.dwRpos, 30 + Manette.dwZpos), 3, C
  
  ' Axe 3 (jaune) :
  C = RGB(0, 0, 255): Form1.FillColor = C
  Form1.Circle (10 + Manette.dwUpos, 30 + Manette.dwVpos), 3, C
  
  Form1.AutoRedraw = False
  Form1.FillStyle = vbFSTransparent
  Form1.DrawMode = vbXorPen
  Form1.Circle (10 + Manette.dwXpos, 30 + Manette.dwYpos), 5, QBColor(15)
  Form1.Circle (10 + Manette.dwRpos, 30 + Manette.dwZpos), 5, QBColor(15)
  Form1.Circle (10 + Manette.dwUpos, 30 + Manette.dwVpos), 5, QBColor(15)

  Label1.Caption = _
      "Xpos =" + Str$(Manette.dwXpos) + vbLf _
    + "Ypos =" + Str$(Manette.dwYpos) + vbLf _
    + "Zpos =" + Str$(Manette.dwZpos) + vbLf _
    + "Rpos =" + Str$(Manette.dwRpos) + vbLf _
    + "Upos =" + Str$(Manette.dwUpos) + vbLf _
    + "Vpos =" + Str$(Manette.dwVpos) + vbLf _
    + "'Point de vue' =" + Str$(Manette.dwPOV) + vbLf _
    + "qté boutons appuyés =" + Str$(Manette.dwButtonNumber) + vbLf _
    + "état boutons =" + Str$(Manette.dwButtons)
  
End Sub

' Dans Module1 :
' =============

Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, pji As Type_JoyInfoEx) As Long

Public Const JOY_RETURN_ALL = &HFFF

Type Type_JoyInfoEx
  dwSize As Long               '  taille de la structure
  dwFlags As Long              '  flags to indicate what to return
  dwXpos As Long              '  x position
  dwYpos As Long              '  y position
  dwZpos As Long              '  z position
  dwRpos As Long               '  rudder/4th axis position
  dwUpos As Long               '  5th axis position
  dwVpos As Long               '  6th axis position
  dwButtons As Long            '  etats des bouttons
  dwButtonNumber As Long      '  numero du bouton presse actuellement
  dwPOV As Long                '  point of view state
  dwReserved1 As Long              '  reserved for communication between winmm driver
  dwReserved2 As Long              '  reserved for future expansion
End Type

Public Manette As Type_JoyInfoEx

Conclusion :


Selon le contrôleur utilisé, l'échelle des valeurs des axes est différente !
la position 'poussée à gauche' à pour valeur 0, la position centrale correspond à la moitier de cette échelle.
Exemples :
- SideWinder Precision Pro = 1024 --> centre = 512
- ThrustMaster Dual Analog = 256 --> centre = 128

==> Si qqun connait un moyen de récupérer ces échelles d'axes, ça m'interesse...(^_^)

Le bouton 'Point de Vue' retourne un angle en centièmes de degrés (précis, non !) Il faut donc diviser par 100. (4500 = 45°)
Aucun point de vue séléctionné retourne 65535 ; Rassurez-vous, ce n'est pas un angle.

Columbiad(^_^)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.