Menu
CoddyTech

מוזיקה לכל מצב

חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 6 מתוך 23.

לכל מצב במשחק יכולה להיות מוזיקה משלו: נעימה רגועה בתפריט, רצועה קצבית בזמן המשחק, וניגון קצר כשמנצחים או מפסידים. כדי לעבור למוזיקה אחרת, טוענים את הרצועה החדשה ומנגנים אותה. טעינת רצועה חדשה מפסיקה את הרצועה הישנה. פונקציה קטנה שומרת את שתי השורות יחד:

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 אונליין