دفقة من الجسيمات
جزء من قسم الصوت وإحساس اللعب في رحلة Pygame على Coddy. الدرس 9 من 23.
الجسيم الواحد نقطة. والانفجار هو عدد كبير من الجسيمات التي تُنشأ في الإطار نفسه وعند النقطة نفسها، وينطلق كل منها في اتجاهه الخاص. أنشئها باستخدام حلقة for، وامنح كل جسيم سرعة عشوائية:
for i in range(20):
particles.append({
"x": x,
"y": y,
"vx": random.uniform(-3, 3),
"vy": random.uniform(-3, 3),
"life": random.randint(20, 40),
})random.uniform(-3, 3) هو عدد عشري عشوائي من -3 إلى 3، لذا يمكن للجسيم أن يتحرك في أي اتجاه، ببطء أو بسرعة. أما randint فسيعطي أعدادًا صحيحة فقط، وسينطلق الانفجار في بضعة خطوط مستقيمة.
يجب أن تكون استدعاءات الدوال العشوائية داخل الحلقة. اختر vx مرة واحدة قبلها، وستحصل الجسيمات العشرون كلها على السرعة نفسها: ستتحرك معًا كنقطة واحدة.
تجعل مدة الحياة العشوائية الانفجار يتلاشى بشكل غير متساوٍ، وهذا يبدو طبيعيًا: فالجسيمات البطيئة قرب الوسط والسريعة عند الحافة تختفي في أوقات مختلفة.
النقر بالماوس هو حدث pygame.MOUSEBUTTONDOWN، وevent.pos هي النقطة التي تم النقر عليها.
التحدي
متوسطتُنشئ النقرة جسيمًا واحدًا يرتفع. حوّل ذلك إلى انفجار:
- عند النقر، أضف 20 جسيمًا إلى النقطة التي تم النقر عليها.
- امنح كل جسيم
vxوvyمنrandom.uniform(-3, 3)، وlifeمنrandom.randint(20, 40).
جرّب بنفسك
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Fireworks")
clock = pygame.time.Clock()
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
particles.append({"x": x, "y": y, "vx": 0, "vy": -2, "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)
pygame.display.flip()
clock.tick(60)
pygame.quit()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الصوت وإحساس اللعب
تدرّب بنفسك: Playground لـ Pygame