הסרת חלקיקים שנעלמו
חלק מהיחידה צליל ותחושת משחק במסלול ה-Pygame של Coddy. שיעור 11 מתוך 23.
חלקיק מת אינו מצויר, אבל הוא עדיין נמצא ברשימה. בכל פריים הלולאה מזיזה אותו ומפחיתה שוב את אורך חייו. לחצו 100 פעמים, והרשימה תכיל 2000 חלקיקים שאף אחד לא יכול לראות, והמשחק ייעשה איטי יותר ויותר. המונה בראש המסך מציג את זה.
הסירו את החלקיקים המתים פעם אחת בכל פריים, אחרי העדכון. הדרך הברורה ביותר יוצרת רשימה חדשה של החלקיקים שעדיין חיים:
particles = [p for p in particles if p["life"] > 0]המשמעות היא: רשימה של כל p שנמצא ב-particles ושאורך חייו גדול מ-0.
אל תסירו פריטים מרשימה בזמן שלולאת for עוברת על אותה רשימה:
for p in particles:
if p["life"] <= 0:
particles.remove(p)כשפריט מוסר, הפריט הבא עובר למקומו, והלולאה מדלגת עליו בלי לבדוק אותו. כאן כל חלקיקי ההתפרצות מתים באותו פריים, ולכן בכל פעם חצי מהם נשארים מאחור. יצירת רשימה חדשה לעולם לא מדלגת על שום דבר.
אתגר
בינוניכל לחיצה יוצרת 20 חלקיקים שחיים במשך 30 פריימים, והמונה אף פעם לא יורד. אחרי לולאת העדכון, החלף את particles ברשימה שמכילה רק את החלקיקים שהערך life שלהם גדול מ־0, כך שהמונה יציג Particles: 0 לאחר שההתפרצות מסתיימת.
נסו בעצמכם
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fireworks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 28)
particles = []
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
for i in range(20):
particles.append({
"x": x,
"y": y,
"vx": random.uniform(-3, 3),
"vy": random.uniform(-3, 3),
"life": 30,
})
for p in particles:
p["x"] += p["vx"]
p["y"] += p["vy"]
p["life"] -= 1
screen.fill((20, 20, 36))
for p in particles:
if p["life"] > 0:
pygame.draw.circle(screen, (255, 160, 60), (p["x"], p["y"]), 3)
label = font.render(f"Particles: {len(particles)}", True, (240, 240, 240))
screen.blit(label, (10, 10))
pygame.display.flip()
clock.tick(60)
pygame.quit()
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה צליל ותחושת משחק
תרגלו בעצמכם: Pygame אונליין