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(^_^)
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.