Menu
CoddyTech

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.

challenge icon

Görev

Orta

Enter oyunu başlatır; mavi kare yeşil hedefe ulaştığında kazanır, lavda ise kaybeder. Her duruma kendi müziğini ver:

  1. Bir parça yükleyip çalan play_music(path, loops=-1) fonksiyonunu yaz.
  2. Döngüden önce assets/music/theme.ogg dosyasını çal.
  3. Durum "play" olduğunda assets/music/level.ogg dosyasını çal.
  4. Durum "win" olduğunda assets/music/win.ogg dosyasını bir kez çal (loops 0); "lose" için assets/music/lose.ogg dosyasını bir kez çal.
  5. 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

Kendi başına pratik yap: Pygame playground