Page 1 sur 2

Unique son dans un menu

Publié : lun. 10/juil./2006 19:12
par Joubarbe
Bonsoir,

J'aimerais simplement créer un menu dans lequel, lorsque l'on passe la souris sur un des boutons, un son se joue. Le problème est que le son se joue à l'infini lorsque le curseur reste sur le bouton ; puisque pour détecter la position de la souris sur un bouton, j'utilise une boucle :

Code : Tout sélectionner

 If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528   And MouseActualY < 570 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BOptionsP,545,527)
    PlaySound(Media_WavButtonSurf)
 EndIf
Si quelqu'un pouvait me dire comment faire pour que le son ne se joue qu'une seule et unique fois, merci :)

Publié : lun. 10/juil./2006 19:23
par Cls
Il te suffit de mettre un booleen que tu mets à vrai lorsque le son a été joué.

Ex :

Code : Tout sélectionner

sonJoue.b = false

If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528   And MouseActualY < 570 And MouseButton(#PB_MouseButton_Left) and Not sonJoue
    DisplayTransparentSprite(Media_BOptionsP,545,527) 
    PlaySound(Media_WavButtonSurf) 

    sonJoue = true

 EndIf

Publié : lun. 10/juil./2006 19:29
par Joubarbe
Ca ne fonctionne pas car lorsque je reviens sur le bouton, le son ne se joue plus. Il faut en fait que ça fasse "click" lorsque je passe le curseur sur le bouton. Il ne faut pas ça joue en boucle mais il faut que ça le fasse à chaque fois :oops:

Edit : il vient d'où le "Not" ? Merci.

Publié : lun. 10/juil./2006 20:38
par Gillou
le not regarde dans les opérateurs de PureBasic

et pour ton code tu peux faire ça :
sonJoue.b = #False

If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528 And MouseActualY < 570 And MouseButton ( #PB_MouseButton_Left ) And Not sonJoue
     DisplayTransparentSprite (Media_BOptionsP,545,527)
     PlaySound (Media_WavButtonSurf)

    sonJoue = #True

Else
    sonJoue = #False
EndIf

Publié : lun. 10/juil./2006 20:55
par Joubarbe
Bah le truc c'est que Not est reconnu comme une variable chez moi :roll:
(J'utilise jaPBe)

Publié : lun. 10/juil./2006 22:10
par Gillou
remplace "And Not sonJoue" par " And sonJoue=#False"

Publié : lun. 10/juil./2006 23:09
par Flype
si 'Not' n'est pas reconnu, utilises-tu purebasic 3.94 ? ce dernier est en effet arrivé avec la v4.

Publié : mar. 11/juil./2006 8:23
par Joubarbe
J'ai bien PureBasic 4.0 mais j'ai l'impression que jaPBe est resté à la 3.93 ou alors tout simplement, Not n'a peut-être pas été implanté dans jaPBe. En tous cas, le Not est-il nécessaire ? Je ne vois pas trop son utilité puisque l'on peut souvent mettre var = False plutôt que Not var... Non ?

Sinon, la commande ne fonctionne toujours pas, j'ai bien un son lorsque je clique, mais si je reste appuyé sur le bouton de la souris, le son se joue en boucle :(

Publié : mar. 11/juil./2006 12:04
par Cls
Gillou a écrit :remplace "And Not sonJoue" par " And sonJoue=#False"
remplace par sonJoue=#True plutot.
et
Else sonJoue = #false End If

C'est l'inverse.

Publié : mar. 11/juil./2006 12:13
par Joubarbe
Non, ça ne marche toujours pas... :mad:
Je veux juste un menu avec du son (un son quand je clique, un son quand je passe sur le bouton), sniff sniff :(

Publié : mar. 11/juil./2006 14:01
par Gillou
Peut-tu poster le code en entier pour que nous t'apportions une réponse adaptée ;)

Publié : mar. 11/juil./2006 14:50
par Joubarbe
Oki :

Code : Tout sélectionner

Procedure GCMainMenu(MouseSprite$,ScreenSprite$)

;Déclaration de la prise en charge des formats graphiques
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseOGGSoundDecoder()
  
;Définition des variables
MouseActualX = 500
MouseActualY = 350

;Chargement des medias
Media_MouseSpriteLoad = LoadSprite(#PB_Any,MouseSprite$)
Media_ScreenSpriteLoad = LoadSprite(#PB_Any,ScreenSprite$)
Media_BNouvellePartie = LoadSprite(#PB_Any,"Button_NouvellePartie.bmp")
Media_BChargerPartie = LoadSprite(#PB_Any,"Button_ChargerPartie.bmp")
Media_BOptions = LoadSprite(#PB_Any,"Button_Options.bmp")
Media_BCredits = LoadSprite(#PB_Any,"Button_Credits.bmp")
Media_BQuitter = LoadSprite(#PB_Any,"Button_Quitter.bmp")
Media_BNouvellePartieHL = LoadSprite(#PB_Any,"Button_NouvellePartieHL.bmp")
Media_BChargerPartieHL = LoadSprite(#PB_Any,"Button_ChargerPartieHL.bmp")
Media_BOptionsHL = LoadSprite(#PB_Any,"Button_OptionsHL.bmp")
Media_BCreditsHL = LoadSprite(#PB_Any,"Button_CreditsHL.bmp")
Media_BQuitterHL = LoadSprite(#PB_Any,"Button_QuitterHL.bmp")
Media_BNouvellePartieP = LoadSprite(#PB_Any,"Button_NouvellePartieP.bmp")
Media_BChargerPartieP = LoadSprite(#PB_Any,"Button_ChargerPartieP.bmp")
Media_BOptionsP = LoadSprite(#PB_Any,"Button_OptionsP.bmp")
Media_BCreditsP = LoadSprite(#PB_Any,"Button_CreditsP.bmp")
Media_BQuitterP = LoadSprite(#PB_Any,"Button_QuitterP.bmp")
Media_WavButtonClic = LoadSound(#PB_Any,"Button_clic.wav")
Media_WavButtonSurf = LoadSound(#PB_Any,"Button_surf.wav")

;Définition de la transparence
TransparentSpriteColor(#PB_Any,RGB(255,0,255))

;Boucle principale : déclaration des mouvements
Repeat
  ClearScreen(RGB(0,0,0))
  
  ;On affiche l'écran principal
  DisplaySprite(Media_ScreenSpriteLoad,0,0)
  DisplayTransparentSprite(Media_BNouvellePartie,545,292)
  DisplayTransparentSprite(Media_BChargerPartie,545,410)
  DisplayTransparentSprite(Media_BOptions,545,528)
  DisplayTransparentSprite(Media_BCredits,545,646)
  DisplayTransparentSprite(Media_BQuitter,545,764)
  
  
  ExamineMouse()
  ExamineKeyboard()
  If MouseDeltaX() < 0
    MouseActualX = MouseX() - 1
  EndIf
  If MouseDeltaX() > 0
    MouseActualX = MouseX() + 1
  EndIf
  If MouseDeltaY() < 0
    MouseActualY = MouseY() - 1
  EndIf
  If MouseDeltaY() > 0
    MouseActualY = MouseY() + 1
  EndIf
  If MouseDeltaX() = 0 And MouseDeltaY() = 0
    MouseActualX = MouseX()
    MouseActualY = MouseY()
  EndIf
  
  ;Matérialisation des boutons
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 293 And MouseActualY < 332
    DisplayTransparentSprite(Media_BNouvellePartieHL,546,291)
    PlaySound(Media_WavButtonSurf)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 410 And MouseActualY < 453
    DisplayTransparentSprite(Media_BChargerPartieHL,546,409)
    PlaySound(Media_WavButtonSurf)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528 And MouseActualY < 570
    DisplayTransparentSprite(Media_BOptionsHL,545,527)
    PlaySound(Media_WavButtonSurf)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 646 And MouseActualY < 688
    DisplayTransparentSprite(Media_BCreditsHL,546,646)
    PlaySound(Media_WavButtonSurf)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 764 And MouseActualY < 807
    DisplayTransparentSprite(Media_BQuitterHL,545,765)
    PlaySound(Media_WavButtonSurf)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 293 And MouseActualY < 332 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BNouvellePartieP,546,291)
    PlaySound(Media_WavButtonClic)
    GCConfigMenu()
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 410 And MouseActualY < 453 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BChargerPartieP,546,409)
    PlaySound(Media_WavButtonClic)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528 And MouseActualY < 570 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BOptionsP,545,527)
    PlaySound(Media_WavButtonClic)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 646 And MouseActualY < 688 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BCreditsP,546,646)
    PlaySound(Media_WavButtonClic)
  EndIf
  If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 764 And MouseActualY < 807 And MouseButton(#PB_MouseButton_Left)
    DisplayTransparentSprite(Media_BQuitterP,545,765)
    PlaySound(Media_WavButtonClic)
    End
  EndIf
  
  ;On affiche la souris ici pour qu'elle soit au dessus des autres sprites
  DisplayTransparentSprite(Media_MouseSpriteLoad,MouseX(),MouseY())
  
  FlipBuffers()
  
Until KeyboardPushed(#PB_Key_Escape)

EndProcedure

Publié : mar. 11/juil./2006 21:12
par comtois
j'ai pas lu le reste, mais dans cet exemple c'est normal que ça ne fonctionne pas

Code : Tout sélectionner

sonJoue.b =  #False

If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528 And MouseActualY < 570 And MouseButton ( #PB_MouseButton_Left ) And Not sonJoue
     DisplayTransparentSprite (Media_BOptionsP,545,527)
     PlaySound (Media_WavButtonSurf)

    sonJoue = #True

Else
    sonJoue = #False
EndIf
SonJoue est remis à zéro dès qu'il passe à un !! puisqu'il se trouve dans la condition qui le valide et le dévalide , je ne sais pas si je suis clair ?
alors un exemple

sonJoue.b = #False

Code : Tout sélectionner

If MouseActualX > 545 And MouseActualX < 753 And MouseActualY > 528 And MouseActualY < 570 And MouseButton ( #PB_MouseButton_Left ) 
  If SonJoue = #False
     DisplayTransparentSprite (Media_BOptionsP,545,527)
     PlaySound (Media_WavButtonSurf)

    sonJoue = #True
  endif

Else
    sonJoue = #False
EndIf
j'ai pas testé ...

si tu quittes la position de ton bouton ou si tu relaches la souris sonjoue est mis à zéro. tu peux arranger ça selon le résultat que tu souhaites, par exemple activer le son que sur un front montant de l'appui de la souris.

Publié : mar. 11/juil./2006 21:32
par Joubarbe
Oui j'avais déjà essayé ça, mais cela ne fonctionne pas non plus. Ni pour le curseur passant sur le bouton, ni pour le clique sur le bouton.

Dès que je reste appuyé, le son joue en boucle. Etrange que personne n'aie jamais rencontré ce problème avant..

Publié : mer. 12/juil./2006 9:03
par Backup
utilise

Code : Tout sélectionner

 Delay(300)
                SendMessage_(Handle de la fenetre,#WM_LBUTTONUP,0,0)
cela force le bouton gauche de la souri a etre relaché au bout de 300 millisecondes :D