Menu
CoddyTech

음악 일시 정지

Coddy Pygame 여정의 사운드와 게임의 손맛 섹션에 포함된 레슨. 23개 중 7번째.

게임이 일시 정지되면 음악도 함께 일시 정지되고, 게임을 재개할 때 같은 지점부터 이어서 재생되어야 합니다. 음악 플레이어에는 이를 위한 두 가지 호출이 있습니다.

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

pause()는 트랙을 현재 위치에서 멈춥니다. unpause()는 그 지점부터 이어서 재생합니다. 이때 stop()과 play()를 사용하지 마세요. play()는 트랙을 처음부터 다시 재생하므로, 플레이어는 일시 정지할 때마다 첫 부분을 듣게 됩니다.

paused를 전환하는 P 키를 눌러 일시 정지 상태가 바뀌는 순간에 다음을 호출하세요.

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

일시 정지할 때 재생 중인 효과음은 짧으므로 저절로 끝납니다. 일시 정지된 게임에서는 효과음을 재생하는 코드가 실행되지 않으므로 새로운 효과음이 재생되지 않습니다.

challenge icon

챌린지

중급

P를 누르면 게임이 일시 정지되고 Paused가 표시됩니다. 음악도 이에 맞게 처리하세요:

  1. P를 눌러 일시 정지할 때 pygame.mixer.music.pause()를 호출하세요.
  2. P를 눌러 다시 시작할 때 pygame.mixer.music.unpause()를 호출하세요.

직접 해보기

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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

사운드와 게임의 손맛의 모든 레슨

직접 연습해 보세요: Pygame 플레이그라운드