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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 962
    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 962
    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.

+ 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