Gérer plus de 1 joysticks dans PB (16 max)

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Gérer plus de 1 joysticks dans PB (16 max)

Message par Dionyzos »

Grace au topic de Flype ici, j'ai trouvé comment gérer plusieurs joysticks via l'API de Windows.

Voici un petit bout de code qui permet de gérer jusqu'à 16 joysticks avec PB :D

Tout d'abord le code du fichier "joylib.pb" à inclure dans votre code principal avec XincludeFile.

Code : Tout sélectionner

;Constantes représentant les valeurs max, min et moyenne des axes X & Y
#POS_MIN = 0
#POS_MOY = 32767
#POS_MAX = 65535

; structure qui contiendra les informations du joystick (état des axes & boutons)
Structure MyJoyStick
        Xpos.l
        Ypos.l
        Zpos.l
        Buttons.l
EndStructure        


Procedure.b JoyGetNumber()
;****************************************************************************************
; Retourne le nombre de Joysticks détéctés.
; Il arrive parfois que les joystick ne soient pas forcément branché dans l'ordre logique
; des ID. C'est pourquoi il est nécessair de scanner tout les ID de 0 à 15.  
;****************************************************************************************
  
  Static JoyInf.MyJoyStick ; infos of joystick
  i=0
  For k=0 To 15
    If joyGetPos_(k,JoyInf) = #JOYERR_NOERROR : i+1 : EndIf
  Next
  ProcedureReturn i

EndProcedure


Procedure JoyGetID(jNBR)
;****************************************************************************************
; Retourne un tableau de JoyNbr éléments contenant l'ID des joysticks de 0 à JoyNbr-1.
; Il arrive parfois que les joystick ne soient pas forcément branché dans l'ordre logique
; des ID. C'est pourquoi il est nécessair de scanner tout les ID de 0 à 15.  
;****************************************************************************************

  Dim JoyID.b(jNBR)
  Static JoyInf.MyJoyStick ; infos of joystick
  i=0
  For k=0 To 15
    If joyGetPos_(k,JoyInf) = #JOYERR_NOERROR
      JoyID(i) = k
      i+1
    EndIf
  Next

EndProcedure


Procedure.l JoyGetAxisX(jID)
;****************************************************************************************
; Retourne l'état de l'axe X du Joystick dont l'id est jID.
; -1= left ; 0=center ; 1=right
;****************************************************************************************

  Static JoyInf.MyJoyStick ; infos of joystick
  joyGetPos_(jID,JoyInf) ; récupération des infos d'état du Joystick dans JoyInf
  If     JoyInf\Xpos < #POS_MOY : ProcedureReturn -1
  ElseIf JoyInf\Xpos = #POS_MOY : ProcedureReturn 0
  ElseIf JoyInf\Xpos > #POS_MOY : ProcedureReturn 1
  EndIf

EndProcedure


Procedure.l JoyGetAxisY(jID)
;****************************************************************************************
; Retourne l'état de l'axe Y du Joystick dont l'id est jID.
; -1= up ; 0=center ; 1=down
;****************************************************************************************

  Static JoyInf.MyJoyStick ; infos of joystick
  joyGetPos_(jID,JoyInf) ; récupération des infos d'état du Joystick dans JoyInf
  If     JoyInf\Ypos < #POS_MOY : ProcedureReturn -1
  ElseIf JoyInf\Ypos = #POS_MOY : ProcedureReturn 0
  ElseIf JoyInf\Ypos > #POS_MOY : ProcedureReturn 1
  EndIf

EndProcedure


Procedure.l JoyGetButton(jID,jBTN)
;****************************************************************************************
; Retourne l'état du bouton jBTN du Joystick dont l'id est jID.
; 0=not pushed ; 1=pushed
;****************************************************************************************

  Static JoyInf.MyJoyStick ; infos of joystick
  joyGetPos_(jID,JoyInf) ; récupération des infos d'état du Joystick dans JoyInf
  If (JoyInf\Buttons & (1<<jBTN)): ProcedureReturn 1
  Else                           : ProcedureReturn 0
  EndIf

EndProcedure
Et mainenant un code exemple d'utilisation de cette petite "librairie" :

Code : Tout sélectionner

XIncludeFile "JoyLib.pb"

nJoy = JoyGetNumber()

JoyGetID(nJoy)

If OpenWindow(0, 0, 0, 200, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, Str(nJoy)+" Joystick(s)")

  If CreateGadgetList(WindowID())

    If nJoy > 0

      ScrollAreaGadget(1000, 0, 0,200,300,160, nJoy*105, 30)

      For k=0 To nJoy-1
        TextGadget((k*10),5,(100*k)+5,100,20,"Joystick#"+Str(k+1))
        TextGadget((k*10)+1,20,(100*k)+25,50,20,"- Axe X :") : TextGadget((k*10)+5,70,(100*k)+25,70,20, "X",#PB_Text_Border)
        TextGadget((k*10)+2,20,(100*k)+45,50,20,"- Axe Y :") : TextGadget((k*10)+6,70,(100*k)+45,70,20, "Y",#PB_Text_Border)
        TextGadget((k*10)+3,20,(100*k)+65,50,20,"- BTN   :") : TextGadget((k*10)+7,70,(100*k)+65,70,20, "B",#PB_Text_Border)
      Next

      CloseGadgetList()

      Repeat

        EventID.l=WindowEvent()

        Delay(50)

        For k=0 To nJoy-1

          id = JoyID(k) ; tableau créé par la procédure JoyGetID() contenant les ID des joysticks

          If JoyGetAxisX(id) = -1 : SetGadgetText((k*10)+5, "LEFT")   : EndIf
          If JoyGetAxisX(id) = 0  : SetGadgetText((k*10)+5, "CENTER") : EndIf
          If JoyGetAxisX(id) = 1  : SetGadgetText((k*10)+5, "RIGHT")  : EndIf
      
          If JoyGetAxisY(id) = -1 : SetGadgetText((k*10)+6, "UP")     : EndIf
          If JoyGetAxisY(id) = 0  : SetGadgetText((k*10)+6, "CENTER") : EndIf
          If JoyGetAxisY(id) = 1  : SetGadgetText((k*10)+6, "DOWN")   : EndIf
      
          ; teste si les boutons du Joystick sont enfoncés
          btn = 0
          If JoyGetButton(id,btn) = 1 : SetGadgetText((k*10)+7, Str(btn+1))
          Else                        : SetGadgetText((k*10)+7, "")
          EndIf

        Next

      Until EventID = #PB_EventCloseWindow

    Else

      TextGadget(1,5,5,200,20,"Auncun Joystick détecté",#PB_Text_Center | #PB_Text_Border)

      Repeat
        EventID.l=WindowEvent()
        Delay(50)
      Until EventID = #PB_EventCloseWindow

    EndIf
  EndIf
EndIf

End
Voilà.
Pour le moment je ne gère pas encore les mouvements analogiques car je ne m'en suis servi pour l'instant qu'avec des pads standards.
Il manque également qq fonctions comme par exemple détecter le nombre de boutons que gère le joystick n, etc...

Je vais l'enrichir au fur et à mesure de mon temps libre :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Cool ! :D
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Yeah :3

Merci
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

:wink: ( content que çà puisse être utile à d'autres )
Image
Répondre