מוזיקה לכל מצב
חלק מהיחידה צליל ותחושת משחק במסלול ה-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.
אתגר
בינונילחיצה על Enter מתחילה את המשחק; הריבוע הכחול מנצח כשהוא מגיע למטרה הירוקה ומפסיד כשהוא מגיע ללבה. הגדר מוזיקה לכל מצב:
- כתוב את
play_music(path, loops=-1)כדי לטעון ולהפעיל רצועה. - לפני הלולאה, הפעל את
assets/music/theme.ogg. - כשהמצב משתנה ל־
"play", הפעל אתassets/music/level.ogg. - כשהמצב משתנה ל־
"win", הפעל אתassets/music/win.oggפעם אחת (loops 0); עבור"lose", הפעל אתassets/music/lose.oggפעם אחת. - כשמקש 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 אונליין