Utiliser la musique et le clavier ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Utiliser la musique et le clavier ?

Message par Micoute »

Bonjour à tous,

Je veux faire un jeu graphique nommé "Le grand voyage temporel" qui fonctionne très bien sans musique, pour que ce jeu soit plus immersif, je voudrais en ajouter, mais dans ce cas, je n'ai plus accès au clavier malgré le la touche Echape fonction.

Pouvez-vous m'aider à trouver la solution ? Dans ce cas, je vous en remercierai jamais assez !

J'ai essayé avec un Thread, mais ça ne fonctionne pas

Si vous avez besoin d'autre partie de code, je vous le fournirai.

Code : Tout sélectionner

; 🔹 THREAD : Joue la musique en parallèle
Procedure LectureMusique(dummy)
  PlaySound(0, #PB_Sound_MultiChannel, 30)  ; Joue en boucle
  Repeat
    Delay(100)  ; Pause légère pour éviter une surcharge CPU
  Until SonActif = 0
  StopSound(ChannelID)  ; Arrête la musique quand le thread se termine
EndProcedure
; **Première énigme**
Procedure GererEnigme1()
  LoadSound(0, Rep$ + "Musiques\Enigme1.ogg")  ; Charge le son
  SonActif = 1  ; Active la musique
  ThreadMusique = CreateThread(@LectureMusique(), 0)  ; Lance le thread musical
  
  enigme$ = ~"Vous êtes projeté dans l'Egypte antique...\n\n"
  enigme$ + ~"Que signifie le symbole du scarabée sacré?\n"
  enigme$ + ~"A - Symbole de la richesse\n"
  enigme$ + ~"Z - Représentation du soleil et de la renaissance"
  
  AfficherSpriteEtTexte("Images\Enigme1.jpg", enigme$)
  
  choix = 0
  Repeat
    ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Escape)
      SonActif = 0 ; Arrête la musique
      WaitThread(ThreadMusique)
      StopSound(ChannelID)  ; ✅ Stopper la musique avant de quitter
      FreeSound(0)
      CloseScreen()
      End  ; 🚀 Quitte immédiatement le programme
    EndIf
    
    If KeyboardPushed(#PB_Key_A)
      choix = 1
    ElseIf KeyboardPushed(#PB_Key_Z)
      choix = 2
    EndIf
    Delay(100)
  Until choix <> 0
  
  SonActif = 0  ; Stoppe la musique après réponse
  WaitThread(ThreadMusique)
  StopSound(ChannelID)
  FreeSound(0)
  
  If choix = 2
    AfficherMessage("Bonne réponse! Le scarabée sacré symbolise le soleil et la renaissance.", "Prochaine énigme en approche...", "")
    AttendreTouche()
    GererEnigme2()  ; 🔄 Passer à la prochaine énigme
  Else
    AfficherMessage("Oups! Mauvaise réponse...", "Réessaie !", "Indice : Il est lié au cycle du soleil.")
    AttendreTouche()
    GererEnigme1()  ; 🔄 Force la progression
  EndIf
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Utiliser la musique et le clavier ?

Message par SPH »

Il manque a la ligne l'image

Code : Tout sélectionner

  AfficherSpriteEtTexte("Images\Enigme1.jpg", enigme$)
PB6.12LTS 64

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Utiliser la musique et le clavier ?

Message par Ar-S »

Du lancement de thread dans une procedure je trouve ça étrange. C'est GPT qui t'a fait ça non ? :mrgreen:
Petit exemple de Falsam ici : viewtopic.php?t=11872
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Utiliser la musique et le clavier ?

Message par Micoute »

Non ce n'est pas Chat GPT, je ne connais pas mais je souhaiterais mettre de la musique dans mon jeu et qui change à chaque époque, mais si j'y arrive dans la première énigme, je ferait une procédure spécifique.

Merci d'avoir prêté attention à ma question.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Guillot
Messages : 672
Inscription : jeu. 25/juin/2015 16:18

Re: Utiliser la musique et le clavier ?

Message par Guillot »

je pense pas que ça soit utile de lancer la musique dans un autre thread
(la zic, ça demande peu de ressources)
ton probleme est de plus sans doute lié à l'utilisation de thread
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Utiliser la musique et le clavier ?

Message par Micoute »

Bonjour à tous,

j'ai fini par trouver la solution, j'ai créé un tableau où j'y ai logé les adresses où se trouvent mes musiques et ajouté une procédure jouer le morrceau demandé.

Code : Tout sélectionner

Procedure JouerMusique(EnigmeID)
  If EnigmeID <= ArraySize(Musique())
    StopSound(#PB_All)
    PlaySound(Musique(EnigmeID), #PB_Sound_Loop, 20)
  Else
    Debug "Pas de musique associée à cette énigme !"
    EndIf
EndProcedure
Procedure GererEnigme1()
  JouerMusique(0)  
  
  enigme$ = ~"Vous êtes projeté dans l'Egypte antique...\n\n"
  enigme$ + ~"Que signifie le symbole du scarabée sacré?\n"
  enigme$ + ~"A - Symbole de la richesse\n"
  enigme$ + ~"Z - Représentation du soleil et de la renaissance"
  
  AfficherSpriteEtTexte("Images\Enigme1.jpg", enigme$)
  
  choix = 0
  Repeat
    ExamineKeyboard()
    
    
    If KeyboardPushed(#PB_Key_A)
      choix = 1
      AfficherMessage("Oups! Mauvaise réponse...", "Réessaie !", "Indice : Il est lié au cycle du soleil.")
      AttendreTouche()
      GererEnigme1()  ; 🔄 Force la progression
    ElseIf KeyboardPushed(#PB_Key_Z)
      choix = 2
      AfficherMessage("Bonne réponse! Le scarabée sacré symbolise le soleil et la renaissance.", "Prochaine énigme en approche...", "")
      AttendreTouche()
      GererEnigme2()  ; 🔄 Passer à la prochaine énigme
    EndIf
    
    If KeyboardPushed(#PB_Key_Escape)
      CloseScreen()
      End  ; 🚀 Quitte immédiatement le programme
    EndIf
    Delay(100)
  Until choix <> 0
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Utiliser la musique et le clavier ?

Message par falsam »

Je pense que mettre en place un thread pour gérer la musique c'est peut être un peu trop ! 🤔

Je vais essayer de te faire quelque chose sans thread en reprenant ton code .....
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Utiliser la musique et le clavier ?

Message par Micoute »

Merci beaucoup falsam.

J'ai fait comme ça pour faire passer le temps le temps que ça charge toutes les musiques, car chaque énigme a son ambiance musicale.

Code : Tout sélectionner

Procedure OuvrirEcran()
  ExamineDesktops()
  largeur = DesktopWidth(0)
  hauteur = DesktopHeight(0)
   
  If OpenScreen(largeur, hauteur, 32, "Le Grand Voyage Temporel") = 0
    MessageRequester("Erreur!", "Impossible d'ouvrir l'écran", #PB_MessageRequester_Ok)
    End
  EndIf  
  
  For i = 0 To 19
    StartDrawing(ScreenOutput())
    Message$ = "Chargement en cours..."
    XPos = (largeur - TextWidth(Message$)) / 2
    YPos = (hauteur - TextHeight(Message$)) / 2
    
    DrawingFont(FontID(1))
    DrawText(XPos, YPos, Message$ + Str(i + 1) + "/20")
    Musique(i) = LoadSound(#PB_Any, Rep$ + "Musiques\Enigme" + Str(i+1) + ".ogg")
    StopDrawing()
    
    FlipBuffers() ; Afficher le texte
    Next i  
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Utiliser la musique et le clavier ?

Message par Marc56 »

J'ai toujours pensé que la musique était de toute façon automatiquement jouée dans un thread par PB ? (pour ne pas être éventuellement saccadée par le reste de l'application)
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Utiliser la musique et le clavier ?

Message par falsam »

@Marc : Ce n'est pas spécifié dans la doc, mais je pense que oui.

@Micoute : Je te propose ce code sans thread avec deux énigmes.
Chaque énigme est accompagné d'une image de fond et d'un son.

Le passage d'une énigme à la suivante supprime la musique en cours.
La touche Escape fonctionne normalement même si la musique est en cours d'écoute.

■ Le code seul n'étant pas fonctionnel, je te propose de télécharger le fichier compressé comprenant le code est les assets.
https://falsam.com/Download/purebasic/micoute.zip

■ code

Code : Tout sélectionner

EnableExplicit

Enumeration window
  #mf
EndEnumeration

Enumeration reponse
  #attenteReponse
  #bonneReponse
  #mauvaiseReponse
EndEnumeration

Enumeration sprite
  #background
  #message
EndEnumeration


; Enigme en cours et nombre d'enigme maximum
Global enigmeEnCours = 1, maxenigmeEnCours = 2

; Question & réponse
Global question.s, reponse.s, toucheReponse, erreur.s, reponseDonnee, reponseValide.b

; Police de caractére à utiliser
Global font = LoadFont(#PB_Any, "Arial", 22, #PB_Font_HighQuality)

; Evenement window
Global event, quit

; Sommaire
Declare GererenigmeEnCours()
Declare AfficherSpriteEtTexte(Image.s, Text.s="")
Declare Message()

; Préambule
If InitSound() = 0 Or InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Information", "Erreur initialisation fonctions 2D", 0)
  End
EndIf

; Plugin images
UsePNGImageDecoder()
UseJPEGImageDecoder()

; Plugin sons
UseOGGSoundDecoder()

; Fenetre de l'application
If OpenWindow(#mf, 0, 0, 800, 600, "Voyage temporel", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  
  If OpenWindowedScreen(WindowID(#mf), 0, 0, 800, 600, 0, 0, 0)
    
    ; Clavier AZERTY
    KeyboardMode(#PB_Keyboard_International)
    
    ; Boucle evenementielle
    Repeat
      Repeat
        ; Traiter tous les evenements non 2D
        event = WindowEvent()
        
        Select event
          Case #PB_Event_CloseWindow
            quit = 1
            
        EndSelect
        
        ; quitter la boucle evenementielle 
        ; quand tous les évenements non 2D sont traités
        ; pour pouvoir passer à l'affichage 2D
      Until event = 0
      
      ; Evenements 2D
      
      ; Clavier
      ExamineKeyboard()
      
      ; Afficher le ou les sprites
      ClearScreen(RGB(0,0,0))      
      
      ; Proposition de l'énigme
      GererenigmeEnCours()
      
      ; Est ce que la réponse est validée  ?
      ; si oui, inutile de tester à nouveau les réponses        
      If reponseValide = #False  
        If KeyboardReleased(#PB_Key_A) 
          If toucheReponse = #PB_Key_A 
            reponseDonnee = #bonneReponse
          Else
            reponseDonnee = #mauvaiseReponse
          EndIf
        EndIf
        
        If KeyboardReleased(#PB_Key_Z) 
          If toucheReponse = #PB_Key_Z 
            reponseDonnee = #bonneReponse
          Else
            reponseDonnee = #mauvaiseReponse
          EndIf
        EndIf
      EndIf 
      
      ; Analyse de la réponse donnée à l'enigme
      If reponseDonnee = #bonneReponse
        reponseValide = #True
        Message()
      EndIf
      
      If reponseDonnee = #mauvaiseReponse
        Message()
      EndIf
      
      
      ; Pour passer à la question suivante
      ; La réponse précédente doit etre validée
      If reponseValide = #True
        If KeyboardReleased(#PB_Key_Space) 
          StopSound(0) ; Arreter le son
          FreeSound(0) ; Liberer le son de la mémoire
          enigmeEnCours + 1 ; Passage à l'énigme suivante
          reponseDonnee = #attenteReponse ; Attente de la prochaine reponse
          reponseValide = #False          ; en attente de validation 
        EndIf
      EndIf
      
      ; Inversion des buffers graphiques
      FlipBuffers()      
      
    Until quit Or KeyboardPushed(#PB_Key_Escape)
  Else
    MessageRequester("Information", "Impossible d'ouvrir la fenetre 2D")
  EndIf
EndIf


; Gérer les enigmeEnCourss
Procedure GererenigmeEnCours()  
  Select enigmeEnCours
      
    Case 1 ;Question 1
      If IsSound(0) = 0 Or SoundStatus(0) <> #PB_Sound_Playing 
        ; Source https://pixabay.com/fr/music/search/egypt/
        LoadSound(0, "scarabesacre.ogg")
        PlaySound(0, #PB_Sound_Loop)
      EndIf
      
      question = "Vous êtes projeté dans l'Egypte antique...||"
      question + "Que signifie le symbole du scarabée sacré?|"
      question + "[A] - Symbole de la richesse|"
      question + "[Z] - Représentation du soleil et de la renaissance|"
      question + "[Esc] - quitter le jeu"
      
      reponse = "Bonne réponse! |"
      reponse + "Le scarabée sacré symbolise le soleil et la renaissance.|"
      reponse + "Presser la touche espace pour la prochaine enigme ..."
      
      erreur = "Oups! Mauvaise réponse...|"
      erreur + "Réessaie !|"
      erreur + "Indice : Il est lié au cycle du soleil."
      
      toucheReponse = #PB_Key_Z 
      AfficherSpriteEtTexte("scarabesacre.png", question)      
      
    Case 2 ;Question 2
      If IsSound(0) = 0 Or SoundStatus(0) <> #PB_Sound_Playing
        ; Source https://pixabay.com/fr/music/search/calcul/
        LoadSound(0, "calcul.ogg")
        PlaySound(0, #PB_Sound_Loop)
      EndIf
      
      question = "Un peu de calcul mental||"
      question + "Quelle est la racine carré de 16|"
      question + "[A] - 4|"
      question + "[Z] - 8||"
      question + "[Esc] - quitter le jeu"
      
      reponse = "4 est effectivement la bonne réponse! |"
      reponse + "Presser la touche [espace] pour la prochaine enigme."
      
      erreur = "Oups! Mauvaise réponse...|"
      erreur + "Réessaie !, Indice : C'est forcément l'autre."
      
      toucheReponse = #PB_Key_A 
      AfficherSpriteEtTexte("calcul.png", question)      
      
    Default ; C'est fini
      If IsSound(0) = 0 Or SoundStatus(0) <> #PB_Sound_Playing 
        ; Source https://pixabay.com/fr/music/search/fin%20heureuse/
        LoadSound(0, "fin.ogg")
        PlaySound(0, #PB_Sound_Loop)
      EndIf
      AfficherSpriteEtTexte("fin.png")
  EndSelect 
EndProcedure

Procedure AfficherSpriteEtTexte(Image.s, Text.s="")
  Protected Sprite, n 
  
  ; Chargement de l'image de fond
  LoadSprite(#background, Image)
  If StartDrawing(SpriteOutput(#background))    
    
    ; Insertion du texte à afficher sur le sprite
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(font))
    
    For n = 1 To CountString(Text, "|") + 1
      DrawText(10, (n-1)*40, StringField(Text, n, "|"), RGB(169, 169, 169))
    Next
    
    StopDrawing()  
  EndIf
  
  DisplaySprite(#background, 0, 0)
EndProcedure

Procedure Message()
  Protected couleurMessage, n, texte.s, largeur = ScreenWidth() - 20, hauteur = 200  
  
  If reponseDonnee = #bonneReponse
    couleurMessage = RGBA(0, 255, 0, 200)
    texte = reponse
  Else
    couleurMessage = RGBA(255, 0, 0, 200)
    texte = erreur
  EndIf
  
  CreateSprite(#message, largeur, hauteur, #PB_Sprite_AlphaBlending)
  If StartDrawing(SpriteOutput(#message))
    Box(0, 0, largeur, hauteur, RGBA(Red(couleurMessage), Green(couleurMessage), 0, 0))
    DrawingMode(#PB_2DDrawing_AlphaChannel)
    Box(0, 0, largeur, hauteur, couleurMessage)
    
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(font))
    
    For n = 1 To CountString(texte, "|") + 1
      DrawText(10, (n-1)*40, StringField(texte, n, "|"), RGB(255, 255, 255))
    Next
    
    StopDrawing()
  EndIf
  
  DisplayTransparentSprite(#message, 10, 390)  
EndProcedure

Comment gérer la musique dans une boucle évènementielle ?
1 Tester si le son est bien initialisé avec la fonction IsSound().
2 Tester le statuts du son (En cours de lecture, en pause, arrêté ) avec la fonction SoundStatus()
3 Et bien sur, jouer le son.

Un exemple avec le son "scarabesacre.ogg"

Code : Tout sélectionner

If IsSound(0) = 0 Or SoundStatus(0) <> #PB_Sound_Playing 
  LoadSound(0, "scarabesacre.ogg")
  PlaySound(0, #PB_Sound_Loop)
EndIf      
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Utiliser la musique et le clavier ?

Message par Micoute »

Merci infiniment falsam, c'est du très bon travail.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre