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.
Tantangan
SedangEnter memulai game; kotak biru menang saat mencapai tujuan hijau dan kalah jika masuk ke lava. Berikan musik untuk setiap state:
- Tulis
play_music(path, loops=-1)untuk memuat dan memutar trek. - Sebelum perulangan, putar
assets/music/theme.ogg. - Saat state berubah menjadi
"play", putarassets/music/level.ogg. - Saat state berubah menjadi
"win", putarassets/music/win.oggsekali (loops 0); untuk"lose", putarassets/music/lose.oggsekali. - 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
4Guncangan Layar dan Kilatan Saat Terkena Serangan
Guncangan LayarKilatan Saat Terkena SeranganJeda BenturanJangan BerlebihanLatihan sendiri: Playground Pygame