IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Musique du jeu bloquée à cause d'un compteur


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut Musique du jeu bloquée à cause d'un compteur
    Salut !

    je me suis fait un petit compteur avant de lancer une action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            if py.time.get_ticks() - start > limit :
                 # action après le temps "limit".
    Le problème c'est qu'il empêche la musique de fonctionner, et pourtant il ne me bloque pas l'affichage.

    Ne peut-on pas écouter une musique pendant le comptage ?
    C'est la musique du jeu.

  2. #2
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut
    Citation Envoyé par nouby Voir le message
    Salut !

    je me suis fait un petit compteur avant de lancer une action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            if py.time.get_ticks() - start > limit :
                 # action après le temps "limit".
    Le problème c'est qu'il empêche la musique de fonctionner, et pourtant il ne me bloque pas l'affichage.

    Ne peut-on pas écouter une musique pendant le comptage ?
    C'est la musique du jeu.
    La musique est sensée se lancer avant la boucle, et le compteur est dans la boucle bien sûr.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 107
    Par défaut
    Je ne vois pas de boucle

  4. #4
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut
    salut !

    en effet, mais il suffit que je dise que c'est dans la boucle, c'est l'info utile.

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 985
    Par défaut
    Hello,

    Un simple if py.time.get_ticks() - start > limit: ne peut absolument pas bloquer le thread audio de Pygame, car SDL gère le son de manière asynchrone par rapport à votre boucle principale. Si la musique "ne fonctionne pas" pendant le comptage, c'est un effet de bord lié à la logique de votre code.

    Il y a deux erreurs classiques qui provoquent très exactement ce symptôme :

    1. Votre "action" s'exécute en boucle infinie (le plus probable)
    Une fois que le temps est écoulé et que py.time.get_ticks() - start > limit devient vrai, cette condition restera vraie indéfiniment. Par conséquent, votre "action" va s'exécuter à chaque passage dans la boucle (donc 60 fois par seconde). Si cette action consiste à jouer un son ou charger un fichier, cela va complètement saturer les canaux audio de Pygame et couper net la musique principale.

    2. La musique est relancée en boucle par erreur
    Vous avez dit que la musique est censée se lancer avant la boucle. Mais si, par accident, votre appel pygame.mixer.music.play() se retrouve dans la boucle while (ou dans un else lié à votre compteur), la musique redémarre 60 fois par seconde sans avoir le temps d'émettre le moindre son, ce qui donne l'impression qu'elle est bloquée.

    Voici un code minimal montrant comment implémenter correctement un compteur non-bloquant avec un flag (une variable booléenne) pour empêcher votre action de s'exécuter en rafale :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    import pygame as py
    import sys
     
    py.init()
    py.mixer.init()
     
    ecran = py.display.set_mode((400, 300))
     
    # 1. On lance la musique UNE SEULE FOIS, bien en dehors et avant la boucle
    # py.mixer.music.load("musique.mp3") 
    # py.mixer.music.play(-1) # -1 pour boucler indéfiniment
     
    start = py.time.get_ticks()
    limit = 3000 # On attend 3 secondes
    action_faite = False # FLAG INDISPENSABLE pour bloquer la répétition de l'action
     
    clock = py.time.Clock()
    running = True
     
    while running:
        for event in py.event.get():
            if event.type == py.QUIT:
                running = False
     
        # 2. Le compteur avec le booléen pour éviter que l'action s'exécute 60 fois par seconde
        if py.time.get_ticks() - start > limit and not action_faite:
            print("L'action se déclenche une seule fois !")
     
            # --- METTRE L'ACTION ICI ---
     
            action_faite = True # Empêche l'action de se répéter indéfiniment
     
        ecran.fill((30, 30, 30))
        py.display.flip()
        clock.tick(60)
     
    py.quit()
    sys.exit()

    Assurez-vous d'utiliser une variable comme action_faite et vérifiez bien l'indentation de votre play() par rapport à votre boucle !
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 107
    Par défaut
    La question que je me pose est: que se passe-t-il pendant le décompte ?
    S'il ne se passe rien, que c'est juste un délai, un simple pygame.time.wait suffit.

  7. #7
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut
    re

    l'action pendant le comptage est d'afficher des sprites qui ne bougent pas car c'est la fin du comptage qui va autoriser leur méthode mouv()

    if limite de temps atteinte, alors game=true

    if game==true, alors :
    sprites.mouv()
    affichage d'autres sprites, et le game commence.

    je voulais avoir de la musique avant la limite de temps et mettre une autre musique dans le game, mais cette musique de game est bloqué par le compteur, car si je met pas le compteur j'ai la musique.

    Voici un code minimal montrant comment implémenter correctement un compteur non-bloquant avec un flag (une variable booléenne) pour empêcher votre action de s'exécuter en rafale
    Super !
    merci beaucoup !!!


    La question que je me pose est: que se passe-t-il pendant le décompte ?
    S'il ne se passe rien, que c'est juste un délai, un simple pygame.time.wait suffit.
    Effectivement , bonne idee, mais j'avais peur de bloquer les evennements et donc la musique aussi, donc j'avais opté pour un compteur
    ;

  8. #8
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut EDIT : RESOLU !!!
    J'ai supprimé la partie compteur, et j'ai toujours pas de musique et pourtant mon jeu fonctionne normal.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       # Musique partie combat.
        py.mixer.music.set_volume(1.1) # Volume max (limité par le volume musique de l'ordinateur). 
        py.mixer.music.load("C:/Prog/assets/msk/boss.ogg")
        py.mixer.music.play(-1)
     
        FPS = 60
     
        while run :
     
            # du noir sur la surface de dessin.
            Ecran.fill(0)

    EDIT : RESOLU !!!

    NE RIEZ PAS !
    NE SOYEZ PAS FACHES

    JE SUIS TROP BETE !
    C'est ça de programmer toute les nuits et les jours....

    Regardez ce qui bloquait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            # Sortie de la boucle de jeu, quitte le programme si la fenêtre est fermée sinon retourne à l'intro.
            #py.mixer.music.stop()

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 985
    Par défaut
    Bonjour,

    C'est curieux ! Dans votre message précédent vous disiez : *"si je mets pas le compteur j'ai la musique"*, et maintenant que vous l'avez enlevé, vous ne l'avez plus. Cela prouve que le problème de fond ne venait pas du compteur en lui-même, mais de la structure de votre code.

    Voici les 4 pistes à vérifier pour résoudre votre problème de son :

    1. Le changement de musique dans la boucle (L'erreur la plus probable)
    Vous expliquez que vous vouliez une musique d'intro, puis la musique "boss.ogg" quand le jeu commence.
    Si vous changez de musique à l'intérieur de votre while (quand le game == True), il faut ABSOLUMENT utiliser le système de "flag" (variable booléenne) que je vous ai montré dans mon précédent message.

    Exemple de ce qu'il faut faire :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Avant la boucle : Musique d'intro
    py.mixer.music.load("intro.ogg")
    py.mixer.music.play(-1)
     
    musique_boss_lancee = False
     
    while run:
        # ...
        if game == True and not musique_boss_lancee:
            # On change la musique UNE SEULE FOIS
            py.mixer.music.load("C:/Prog/assets/msk/boss.ogg")
            py.mixer.music.play(-1)
            musique_boss_lancee = True # INDISPENSABLE
    Si vous avez mis le load() et le play() de boss.ogg dans un if game == True *sans* le flag, votre jeu va recharger et relancer boss.ogg 60 fois par seconde. Conséquence : la musique redémarre en boucle très vite et ça donne un silence total ! C'est presque certainement ce qui vous arrive.

    2. Un autre play() caché ?
    Dans le bout de code que vous avez posté, l'appel de boss.ogg est bien en dehors du while. Mais assurez-vous qu'il n'y a pas un *autre* pygame.mixer.music.play() caché plus bas à l'intérieur de votre boucle while.

    3. Le volume
    py.mixer.music.set_volume() prend une valeur flottante entre 0.0 et 1.0. Mettre 1.1 ne fera pas crasher le jeu (Pygame va simplement plafonner à 1.0), mais par bonne pratique, mettez plutôt 1.0.

    4. Le fichier audio
    Puisque votre jeu ne crashe pas, c'est que le chemin "C:/Prog/assets/msk/boss.ogg" est valide. Mais êtes-vous sûr que ce fichier n'est pas silencieux au début, ou corrompu ? Essayez de remplacer temporairement "C:/Prog/assets/msk/boss.ogg" par votre musique d'intro qui fonctionnait avant, juste pour voir si le son sort bien.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 771
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 771
    Par défaut
    nouby c'est loin d'être clair pour nous, tu nous montre 2 lignes de commentaires, dont une est une instruction d'arrêt de la musique, on doit comprendre que tu avais laissé cette commande d'arrêt, donc sa mise en commentaire a résolu le problème? (je suppose que c'est ça, y compris pour ton problème initial?)
    Comment voudrais-tu que l'on eût pu t'aider à trouver cette maladresse? (bien que la réponse de Fred évoque la présence un autre play, ça n'en était pas loin)

  11. #11
    Membre confirmé
    Homme Profil pro
    sans
    Inscrit en
    Mai 2023
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2023
    Messages : 316
    Par défaut
    Oui, c'est exactement ça, j'ai mis en commentaire le music.stop() et tout fonctionne !
    car je l'avais mis en sortie de la boucle de jeu, alors que la musique avait été lancée juste avant la boucle de jeu, donc un tour de boucle et hop plus de musique.

    j'ai fais l'idiot, faut que je me repose un peu entre deux codes.

    La dernière fois j'avais subit le problème que soulève fred dans son dernier message, et je sais plus comment j'avais reussi à m'en sortir, on m'avait certainement aidé sur le forum, j'ai fais tellement de demandes d'aides, sur différents sujets liés à mon projet. lol

    j'aime beaucoup les réponses sur ce forum, elles sont toujours très détaillées et soulèvent souvent des points auquels on ne s'attendait pas.
    merci les gars !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Contrat pour utilisation musique dans jeu video
    Par supergrey dans le forum Contrat
    Réponses: 1
    Dernier message: 05/05/2010, 20h47
  2. Flash bloque a cause des liens ?
    Par Dugom dans le forum Flash
    Réponses: 1
    Dernier message: 21/11/2006, 16h25
  3. Musique pour jeu
    Par Invité4 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 26/08/2006, 10h30
  4. Réponses: 4
    Dernier message: 20/03/2006, 18h12
  5. Accès à une JDialog bloqué à cause d'un setModal()
    Par seiryujay dans le forum Agents de placement/Fenêtres
    Réponses: 15
    Dernier message: 21/07/2005, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo