Gestion du joystick par l'API Windows

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Gestion du joystick par l'API Windows

Message par Flype »

Pour ceux que çà intéresse, une petite demo des fonctions multimedia de Windows :

Code : Tout sélectionner

; 
; Win32 / Multimedia / Joystick
; 

Enumeration ; #JOYCAPS_
  #JOYCAPS_HASZ = 1
  #JOYCAPS_HASR = 2
  #JOYCAPS_HASU = 4
  #JOYCAPS_HASV = 8
  #JOYCAPS_HASPOV = 16
  #JOYCAPS_POV4DIR = 32
  #JOYCAPS_POVCTS = 64
EndEnumeration

Procedure.l MyDraw(*caps.JOYCAPS, *info.JOYINFOEX)
  
  TextColor = $F0F0F0
  LineColor = $966E47
  FrontColor = $A77F58
  
  iw = ImageWidth(0)
  ih = ImageHeight(0)
  
  iw2 = iw - 50
  ih2 = ih - 50
  
  If StartDrawing(ImageOutput(0))
    
    x = (*info\dwXpos*iw2)/*caps\wXmax
    y = (*info\dwYpos*ih2)/*caps\wYmax
    w = (*info\dwRpos*iw2)/*caps\wRmax
    h = (*info\dwZpos*ih2)/*caps\wZmax
    
    DrawingMode(1)
    DrawingFont(FontID(0))
    
    Box(0,0,iw,ih,FrontColor)
    Line(iw/2-2,0,0,ih,LineColor)
    Line(0,ih/2-2,iw,0,LineColor)
    Box(25,25,iw2,ih2,LineColor)
    Line(iw/2-2,25,0,ih2,FrontColor)
    Line(25,ih/2-2,iw2,0,FrontColor)
    Line(x+25,0,0,ih,FrontColor)
    Line(0,y+25,iw,0,FrontColor)
    Ellipse(25+x,25+y,w/2,h/2,LineColor)
    Ellipse(25+x,25+y,(w/2)-5,(h/2)-5,FrontColor)
    Line(x+25,y-h/2+25,0,h,LineColor)
    Line(x-w/2+25,y+25,w,0,LineColor)
    
    y = 15
    For i = 0 To *caps\wMaxButtons - 1
      If (i % 4) = 0
        x = iw-145 : y + 26
      EndIf
      x + 26
      button = Pow(2,i)
      If (*info\dwButtons & button)
        Circle(x,y,12,FrontColor)
        Circle(x,y,10,$193CC0)
      Else
        DrawingMode(4)
        Circle(x,y,12,FrontColor)
        Circle(x,y,11,LineColor)
        DrawingMode(1)
      EndIf
      If (i<*caps\wNumButtons)
        DrawText(x-7,y-6,RSet(Str(i+1),2,"0"),TextColor)
      Else
        DrawText(x-7,y-6,RSet(Str(i+1),2,"0"),FrontColor)
      EndIf
    Next
    
    x = 10
    
    DrawText(x,10,"Name: "+PeekS(@*caps\szPname),TextColor)
    DrawText(x,25,"Manufacturer: 0x"+Hex(*caps\wMid),TextColor)
    DrawText(x,40,"Product: 0x"+Hex(*caps\wPid),TextColor)
    DrawText(x,55,"RegKey: "+PeekS(@*caps\szRegKey),TextColor)
    DrawText(x,70,"OEM: "+PeekS(@*caps\szOEMVxD),TextColor)
    
    DrawText(x,105,"Nb Axes: "+Str(*caps\wNumAxes)+"/"+Str(*caps\wMaxAxes),TextColor)
    DrawText(x,120,"Period: "+Str(*caps\wPeriodMin)+"/"+Str(*caps\wPeriodMax)+" ms",TextColor)
    DrawText(x,150,"HasZ: "+Str((*caps\wCaps & #JOYCAPS_HASZ)/#JOYCAPS_HASZ),TextColor)
    DrawText(x,165,"HasR: "+Str((*caps\wCaps & #JOYCAPS_HASR)/#JOYCAPS_HASR),TextColor)
    DrawText(x,180,"HasU: "+Str((*caps\wCaps & #JOYCAPS_HASU)/#JOYCAPS_HASU),TextColor)
    DrawText(x,195,"HasV: "+Str((*caps\wCaps & #JOYCAPS_HASV)/#JOYCAPS_HASV),TextColor)
    DrawText(x,210,"HasPOV: "+Str((*caps\wCaps & #JOYCAPS_HASPOV)/#JOYCAPS_HASPOV),TextColor)
    DrawText(x,225,"POV4DIR: "+Str((*caps\wCaps & #JOYCAPS_POV4DIR)/#JOYCAPS_POV4DIR),TextColor)
    DrawText(x,240,"POVCTS: "+Str((*caps\wCaps & #JOYCAPS_POVCTS)/#JOYCAPS_POVCTS),TextColor)
    DrawText(x,255,"Caps: %"+RSet(Bin(*caps\wCaps),7,"0"),TextColor)
    
    DrawText(x,285,"POV: "+Str(*info\dwPOV),TextColor)
    DrawText(x,315,"X: "+RSet(Str(*info\dwXpos),5,"0")+" ("+Str(*caps\wXmin)+","+Str(*caps\wXmax)+")",TextColor)
    DrawText(x,330,"Y: "+RSet(Str(*info\dwYpos),5,"0")+" ("+Str(*caps\wYmin)+","+Str(*caps\wYmax)+")",TextColor)
    DrawText(x,345,"Z: "+RSet(Str(*info\dwZpos),5,"0")+" ("+Str(*caps\wZmin)+","+Str(*caps\wZmax)+")",TextColor)
    DrawText(x,360,"R: "+RSet(Str(*info\dwRpos),5,"0")+" ("+Str(*caps\wRmin)+","+Str(*caps\wRmax)+")",TextColor)
    DrawText(x,375,"U: "+RSet(Str(*info\dwUpos),5,"0")+" ("+Str(*caps\wUmin)+","+Str(*caps\wUmax)+")",TextColor)
    DrawText(x,390,"V: "+RSet(Str(*info\dwVpos),5,"0")+" ("+Str(*caps\wVmin)+","+Str(*caps\wVmax)+")",TextColor)
    
    DrawText(iw-175,ih-15,"Buttons: %"+RSet(Bin(*info\dwButtons),16,"0"),TextColor)
    
    StopDrawing()
    
    SetGadgetState(0,ImageID(0))
    
  EndIf
  
EndProcedure

iw = 640
ih = 480

If OpenWindow(0,0,0,iw,ih,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Joystick (Win32)")
  
  If CreateGadgetList(WindowID(0))
    CreateImage(0,iw,ih)
    ImageGadget(0,0,0,iw,ih,ImageID(0))
    LoadFont(0,"Verdana",7,#PB_Font_HighQuality)
  EndIf
  
  If joySetCapture_(WindowID(0),#JOYSTICKID1,#Null,#False) = #JOYERR_NOERROR
    If joyGetDevCaps_(#JOYSTICKID1,joyCaps.JOYCAPS,SizeOf(JOYCAPS)) = #JOYERR_NOERROR
      ; done
    EndIf
  EndIf
  
  joyInfoEx.JOYINFOEX
  joyInfoEx\dwFlags = #JOY_RETURNALL
  joyInfoEx\dwSize = SizeOf(JOYINFOEX)
  
  Repeat
    
    Select WaitWindowEvent(50)
      Case #PB_Event_CloseWindow: Break
    EndSelect
    
    If joyGetPosEx_(#JOYSTICKID1,joyInfoEx) = #JOYERR_NOERROR
      MyDraw(joyCaps,joyInfoEx)
    EndIf
    
    Delay(1)
    
  ForEver
  
  If joyReleaseCapture_(#JOYSTICKID1) = #JOYERR_NOERROR
    ; done
  EndIf

EndIf
 
Image
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

Salut Flype :)

Je ne sais pas si c'est moi qui ne sait pas faire de copier/coller, mais ton code me génère une multitude d'erreurs. Plus j'en corrige plus il m'en trouve de nouvelles :(

Et question : est-ce que ton code (lorsqu'il marche) il est capable de gérer plus de 1 manette à la fois ?

Ca ca serait intéressant vu que PB ne sait pas gérer les autres manettes que celle par défaut, c'est à dire la première :?

Je suis actuellement en train de développer une jeu pour 4 joueurs sur les même écran, et j'aimerais que tous puissent utiliser un pad :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oui c'est censé reconnaitre 255 joysticks ( Sauf sur windows NT, limité à 2 ) !
ce code est écrit pour PB4, tes erreurs doivent venir de çà, non ?

voici une p'tite mise à jour :
File:1->winmm_joystick.zip
Image
Dernière modification par Flype le mar. 28/févr./2006 9:54, modifié 1 fois.
Image
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message par julien »

C'est du code PB4, il me semble
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ahahah plus rapide :twisted:
Image
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

Merci Flype pour cette version modifiée, je vais l'essayer dès que j'ai un pad sous la main :D

Mais la v4.0 n'est pas encore officiellement sortie, donc c'est du code pour la verison Beta ? :o

D'ailleurs je compte acheter la version complète de PB 3.94, vous savez si on recoit automatiquement une préversion 4 avec ? :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

Oui, c'est bien un code PB4(beta) en prévision de la version finale...
mais c'est très facilement transposable en 3.94 :roll:

En fait quand tu achètes purebasic,
tu obtiens un login/motdepasse pour le site officiel (www.purebasic.com).
Ce log, te permets dans la section 'download' de télécharger toutes les versions disponibles (win32,macos,linux,amigaos,betatest).

:wink:
Image
CameleonTH
Messages : 333
Inscription : sam. 25/juin/2005 11:18
Localisation : Laon (02)
Contact :

Message par CameleonTH »

Pour tester il faut que je répar ma manette :D
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

j'ai cette erreur avec ton code mise à jour :

Code : Tout sélectionner

Ligne 165 Constant not found : #JOY_CONFIGCHANGED_MSGSTRING
Et quand j'essaie de la créer en haut du fichier avec une valeur bidon, j'ai une grosse erreur du "Linker" :?

il manque pas un fichier include ? :(
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

elles sont définies par défaut uniquement dans PB4 beta4...

donc les voici pour les versions antérieures:

Code : Tout sélectionner

#JOYCAPS_HASZ    = 1
#JOYCAPS_HASR    = 2
#JOYCAPS_HASU    = 4
#JOYCAPS_HASV    = 8
#JOYCAPS_HASPOV  = 16
#JOYCAPS_POV4DIR = 32
#JOYCAPS_POVCTS  = 64

#JOY_CONFIGCHANGED_MSGSTRING = "MSJSTICK_VJOYD_MSGSTR"
Au fait n'ayant moi meme que 2 manettes (et encore quand mon pote passe), tu pourra m'informer si tout marche bien, çà m'intéresse ?
Image
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Message par Dionyzos »

Je possède 4 pad USB, donc je te tiens au courant dès que ca marche chez moi :)

Et justement, même avec les constantes, ca passe toujours pas :'(

il me dit que HEAD is not a valid operator.

J'ai peur que ton code soit trop orienté PB4 :(
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

bon, on va refaire une version 3.94 alors...
mais patiente un peu...

4 pad usb, veinard :)
Image
Anonyme

Message par Anonyme »

tu compte ajouté le retour de force? :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

tu sais moi je n'ajoute rien, il s'agit juste d'un exemple sur comment utiliser les fonctions joystick de la bibliothèque multimedia de windows (winmm) laquelle ne supporte justement pas le retour de force, seule directx permet de le faire (et là je sais pas faire).
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

voilà c'est fait.

File:1->winmm_joystick_PB394.zip
Image
Image
Répondre