Menu
CoddyTech

각 상태별 음악

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

게임의 각 상태마다 고유한 음악을 사용할 수 있습니다. 메뉴에서는 차분한 테마곡을, 플레이하는 동안에는 빠른 곡을, 이기거나 질 때는 짧은 곡을 재생할 수 있습니다. 곡을 바꾸려면 새 트랙을 불러와 재생하면 됩니다. 새 트랙을 불러오면 이전 트랙은 멈춥니다. 작은 함수로 이 두 줄을 하나로 묶을 수 있습니다.

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

state를 설정하는 줄, 즉 상태가 바뀌는 순간에 음악을 바꾸세요.

if player.colliderect(goal):
    state = "win"
    play_music("assets/music/win.ogg", 0)

이 줄은 한 번 실행되므로 트랙도 한 번 시작합니다. 그리기 부분에서 if state == "win": 안에 음악 전환 코드를 넣지 마세요. 이 부분은 매 프레임 실행되어 트랙을 초당 60번 다시 시작합니다.

승리와 패배 음악은 짧고 저절로 끝나므로 loops를 0으로 설정합니다. 테마곡과 레벨 트랙은 -1로 반복 재생합니다.

challenge icon

챌린지

중급

Enter를 누르면 게임이 시작됩니다. 파란색 사각형은 초록색 목표 지점에 도달하면 승리하고 용암에 닿으면 패배합니다. 각 상태에 맞는 음악을 지정하세요.

  1. 트랙을 불러와 재생하는 play_music(path, loops=-1)를 작성하세요.
  2. 루프 전에 assets/music/theme.ogg를 재생하세요.
  3. 상태가 "play"가 되는 곳에서 assets/music/level.ogg를 재생하세요.
  4. 상태가 "win"이 되는 곳에서 assets/music/win.ogg를 한 번 재생하세요(loops 0). "lose"의 경우에는 assets/music/lose.ogg를 한 번 재생하세요.
  5. Enter를 눌러 "menu"로 돌아가는 곳에서 theme.ogg를 다시 재생하세요.

직접 해보기

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)

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

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_RETURN:
            if state == "menu":
                state = "play"
                player.topleft = (40, 160)
            elif state in ("win", "lose"):
                state = "menu"

    if state == "play":
        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"
        elif player.colliderect(lava):
            state = "lose"

    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)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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