Menu
CoddyTech

הסרת חלקיקים שנעלמו

חלק מהיחידה צליל ותחושת משחק במסלול ה-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)

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

challenge icon

אתגר

בינוני

כל לחיצה יוצרת 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()
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה צליל ותחושת משחק

תרגלו בעצמכם: Pygame אונליין