Gérer plus de 1 joysticks dans PB (16 max)
Publié : sam. 04/mars/2006 10:25
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
Tout d'abord le code du fichier "joylib.pb" à inclure dans votre code principal avec XincludeFile.
Et mainenant un code exemple d'utilisation de cette petite "librairie" :
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
Voici un petit bout de code qui permet de gérer jusqu'à 16 joysticks avec PB

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
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
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
