Menu
CoddyTech

Musik pausieren

Teil des Abschnitts Sound und Spielgefühl der Pygame-Journey von Coddy. Lektion 7 von 23.

Wenn das Spiel pausiert wird, sollte auch die Musik pausieren und an derselben Stelle fortgesetzt werden, sobald das Spiel weiterläuft. Der Musikplayer hat dafür zwei Aufrufe:

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

pause() hält den Titel an seiner aktuellen Stelle an. unpause() setzt ihn von dort aus fort. Verwende dafür nicht stop() und play(): play() startet den Titel wieder von Anfang an, und der Spieler hört jedes Mal die ersten Takte, wenn er pausiert.

Rufe sie in dem Moment auf, in dem sich die Pause ändert und P paused umschaltet:

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

Soundeffekte, die gerade abgespielt werden, wenn du pausierst, werden von selbst beendet; sie sind kurz. In einem pausierten Spiel werden keine neuen gestartet, weil der Code, der sie abspielt, nicht ausgeführt wird.

challenge icon

Aufgabe

Mittel

P pausiert das Spiel und zeigt Paused an. Sorge dafür, dass die Musik dem folgt:

  1. Wenn P pausiert, rufe pygame.mixer.music.pause() auf.
  2. Wenn P fortsetzt, rufe pygame.mixer.music.unpause() auf.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Sound und Spielgefühl

Übe selbstständig: Pygame-Playground