음악 일시 정지
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()일시 정지할 때 재생 중인 효과음은 짧으므로 저절로 끝납니다. 일시 정지된 게임에서는 효과음을 재생하는 코드가 실행되지 않으므로 새로운 효과음이 재생되지 않습니다.
챌린지
중급P를 누르면 게임이 일시 정지되고 Paused가 표시됩니다. 음악도 이에 맞게 처리하세요:
- P를 눌러 일시 정지할 때
pygame.mixer.music.pause()를 호출하세요. - 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()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
사운드와 게임의 손맛의 모든 레슨
직접 연습해 보세요: Pygame 플레이그라운드