Menu
CoddyTech

Mettre la musique en pause

Fait partie de la section Son et sensations de jeu du Journey Pygame de Coddy. Leçon 7 sur 23.

Lorsque le jeu se met en pause, la musique doit se mettre en pause elle aussi, puis reprendre au même endroit lorsque la partie reprend. Le lecteur de musique propose deux appels pour cela :

pygame.mixer.music.pause()
pygame.mixer.music.unpause()

pause() arrête la piste là où elle en est. unpause() reprend à cet endroit. N’utilisez pas stop() et play() pour cela : play() relance la piste depuis le début, et le joueur entend les premières mesures à chaque fois qu’il met le jeu en pause.

Appelez-les au moment où l’état de pause change, lorsque P inverse la valeur de paused :

paused = not paused
if paused:
    pygame.mixer.music.pause()
else:
    pygame.mixer.music.unpause()

Les effets sonores en cours au moment de la pause se terminent d’eux-mêmes ; ils sont courts. Un jeu en pause ne déclenche aucun nouvel effet sonore, car le code qui les joue ne s’exécute pas.

challenge icon

Défi

Moyen

P met le jeu en pause et affiche Paused. Fais en sorte que la musique suive :

  1. Quand P met le jeu en pause, appelle pygame.mixer.music.pause().
  2. Quand P reprend, appelle pygame.mixer.music.unpause().

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Lava Run")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)


def play_music(path, loops=-1):
    pygame.mixer.music.load(path)
    pygame.mixer.music.play(loops)


play_music("assets/music/theme.ogg")

player = pygame.Rect(40, 160, 30, 30)
goal = pygame.Rect(420, 160, 30, 30)
lava = pygame.Rect(0, 320, 480, 40)
state = "menu"
paused = False

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_p:
            if state == "play":
                paused = not paused
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_RETURN:
            if state == "menu":
                state = "play"
                play_music("assets/music/level.ogg")
                player.topleft = (40, 160)
            elif state in ("win", "lose"):
                state = "menu"
                play_music("assets/music/theme.ogg")

    if state == "play" and not paused:
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            player.x -= 4
        if keys[pygame.K_RIGHT]:
            player.x += 4
        if keys[pygame.K_UP]:
            player.y -= 4
        if keys[pygame.K_DOWN]:
            player.y += 4
        player.clamp_ip(screen.get_rect())
        if player.colliderect(goal):
            state = "win"
            play_music("assets/music/win.ogg", 0)
        elif player.colliderect(lava):
            state = "lose"
            play_music("assets/music/lose.ogg", 0)

    screen.fill((30, 30, 46))
    if state == "menu":
        title = font.render("Press Enter to start", True, (240, 240, 240))
        screen.blit(title, title.get_rect(center=(240, 180)))
    else:
        pygame.draw.rect(screen, (230, 90, 40), lava)
        pygame.draw.rect(screen, (90, 200, 120), goal)
        pygame.draw.rect(screen, (80, 160, 255), player)
        if state == "win":
            message = font.render("You win!", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 100)))
        elif state == "lose":
            message = font.render("Game over", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 100)))
        elif paused:
            message = font.render("Paused", True, (240, 240, 240))
            screen.blit(message, message.get_rect(center=(240, 100)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Son et sensations de jeu

Entraînez-vous par vous-même : Playground Pygame