@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