Menu
CoddyTech

Musik untuk Setiap Keadaan

Termasuk bagian Suara dan Sensasi Bermain dalam perjalanan Pygame di Coddy. Pelajaran 6 dari 23.

Setiap keadaan dalam game bisa memiliki musiknya sendiri: tema yang tenang di menu, lagu yang ramai saat kamu bermain, serta melodi pendek saat kamu menang atau kalah. Untuk menggantinya, muat lagu baru lalu putar. Memuat lagu baru akan menghentikan lagu sebelumnya. Fungsi kecil menyatukan kedua baris ini:

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

Ganti musik saat keadaan berubah, pada baris yang menetapkan state:

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

Baris itu berjalan satu kali, jadi lagu mulai satu kali. Jangan mengganti musik di dalam if state == "win": pada bagian penggambaran: bagian itu berjalan di setiap frame dan memulai ulang lagu 60 kali per detik.

Melodi menang dan kalah berdurasi pendek dan berhenti sendiri, jadi nilai loops-nya 0. Tema dan lagu level berulang dengan -1.

challenge icon

Tantangan

Sedang

Enter memulai game; kotak biru menang saat mencapai tujuan hijau dan kalah jika masuk ke lava. Berikan musik untuk setiap state:

  1. Tulis play_music(path, loops=-1) untuk memuat dan memutar trek.
  2. Sebelum perulangan, putar assets/music/theme.ogg.
  3. Saat state berubah menjadi "play", putar assets/music/level.ogg.
  4. Saat state berubah menjadi "win", putar assets/music/win.ogg sekali (loops 0); untuk "lose", putar assets/music/lose.ogg sekali.
  5. Saat Enter mengembalikan state ke "menu", putar theme.ogg lagi.

Coba sendiri

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()

Semua pelajaran di Suara dan Sensasi Bermain

Latihan sendiri: Playground Pygame