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اختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الصوت وإحساس اللعب

تدرّب بنفسك: Playground لـ Pygame