إزالة الجسيمات المنتهية
جزء من قسم الصوت وإحساس اللعب في رحلة 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()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame