Her Durum İçin Müzik
Coddy'nin Pygame Journey'sinin Ses ve Oyun Hissi bölümünün bir parçası. Ders 6 / 23.
Bir oyunun her durumunun kendine ait müziği olabilir: menüde sakin bir tema, oynarken hareketli bir parça, kazandığınızda veya kaybettiğinizde kısa bir melodi. Geçiş yapmak için yeni parçayı yükleyip çalın. Yeni bir parça yüklemek eskisini durdurur. Küçük bir işlev bu iki satırı bir arada tutar:
def play_music(path, loops=-1):
pygame.mixer.music.load(path)
pygame.mixer.music.play(loops)Müziği, state değerini ayarlayan satırda, durum değiştiği anda değiştirin:
if player.colliderect(goal):
state = "win"
play_music("assets/music/win.ogg", 0)Bu satır bir kez çalışır, dolayısıyla parça da bir kez başlar. Çizim bölümünde if state == "win": içine geçiş kodu koymayın: bu bölüm her karede çalışır ve parçayı saniyede 60 kez yeniden başlatır.
Kazanma ve kaybetme melodileri kısadır ve kendiliğinden sona erer; bu nedenle loops değerleri 0 olur. Tema ve bölüm parçası -1 ile döngüye girer.
Görev
OrtaEnter oyunu başlatır; mavi kare yeşil hedefe ulaştığında kazanır, lavda ise kaybeder. Her duruma kendi müziğini ver:
- Bir parça yükleyip çalan
play_music(path, loops=-1)fonksiyonunu yaz. - Döngüden önce
assets/music/theme.oggdosyasını çal. - Durum
"play"olduğundaassets/music/level.oggdosyasını çal. - Durum
"win"olduğundaassets/music/win.oggdosyasını bir kez çal (loops 0);"lose"içinassets/music/lose.oggdosyasını bir kez çal. - Enter ile
"menu"durumuna dönüldüğünde theme.ogg dosyasını yeniden çal.
Kendin dene
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()
Ses ve Oyun Hissi bölümündeki tüm dersler
4Ekran Sarsıntısı ve Darbe Parlaması
Ekran SarsıntısıDarbe ParlamasıDarbe DurdurmasıAbartıdan Kaçının6Yıldız Devriyesini Geliştir
Yıldız Devriyesi SesleriHer Vuruşta KıvılcımlarKendi başına pratik yap: Pygame playground