Joystick et autres manettes de jeu (optimisé)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 385 fois - Téléchargée 29 fois

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

Ajouter un commentaire

Commentaires

skyzo410
Messages postés
25
Date d'inscription
mercredi 20 décembre 2000
Statut
Membre
Dernière intervention
28 octobre 2009
-
Ok j'ai trouvé :
For i% = 0 To 30
' Teste chaque bouton
If (Manette.dwButtons And (2 ^ i%)) > 0 Then
C = vbGreen ' bouton appuyé
Text1.Text = Manette.dwButtons ' renvoi le nbs calculé (on peut ensuite faire un routine qui pour chaque calcul unique renvoi un numéro de bouton choisi)

Else
C = vbRed ' bouton relaché
End If
skyzo410
Messages postés
25
Date d'inscription
mercredi 20 décembre 2000
Statut
Membre
Dernière intervention
28 octobre 2009
-
Salut, ta source tombe bien car j'ai besoin de faire un petit soft perso pour emuler 30 boutons avec des touches clavier.

En modifiant un poil ta source je fait bien apparaitre mes 30 boutons qui s'allume en vert lorsque j'appuie dessus. Je souhaitera pouvoir recuperer le numero du bouton sur lequel j'appuie. Peux tu m'aider stp
cs_fanfan85
Messages postés
2
Date d'inscription
mercredi 21 mai 2003
Statut
Membre
Dernière intervention
5 mars 2008
-
Salut à tous et merci pour la source, elle fonctionne à merveille.
Simple, sobre et efficace !
Donc mille mercis.
jean-pierre
cs_PaTaTe
Messages postés
1878
Date d'inscription
mercredi 21 août 2002
Statut
Contributeur
Dernière intervention
7 janvier 2019
-
pekch ==|> Si tu fait référence à moi, je ne vois pas où est le problème.

En ce qui concerne les pads PSX, tout dépend de l'adaptateur utilisé ...
pekch
Messages postés
51
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
7 juillet 2006
-
vraiment nickel
génial, c'est exactement ce que je recherchais, t'as bien assuré...
je vais pouvoir me mettre a faire mon soft de controle de l'ordi par une manette (souris + kk fonctions clavier)
parce que je bosse 8h / jour a la souris, et mon dos il commence a se desequilibrer lol donc la au moins mes deux mains seront au meme niveau!!!
De plus ca marche impec avec les pads PSX, ecoute pas les aigris LOL

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.