الدرس 9 من 10
نظام الجسيمات
- 15 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
إنشاء الجسيمات وتحريكها وحذفها بأمان
الشرح
الشرر والدخان والانفجارات ليست رسومًا جاهزة، بل مئات النقاط الصغيرة، لكل منها موضع وسرعة وعمر بالثواني، وفي كل إطار يتحرّك الجسيم بسرعته وينقص عمره بمقدار dt، فإذا انتهى عمره حُذف.
والحذف في أثناء المرور على المصفوفة خطأ معروف، لأن splice(i, 1) يزيح كل العناصر التي بعد i خانة واحدة إلى الوراء، فتتخطّى الحلقة التي تبدأ من أول المصفوفة الجسيم التالي ولا تحدّثه في هذا الإطار. والحلّ أن تمرّ على المصفوفة من آخرها، لأن الإزاحة عندها لا تمسّ إلا العناصر التي مررت بها.
ولا بد من حدّ أعلى، لأن كل انفجار يضيف عشرات الجسيمات، وتتابع الانفجارات يُثقل كل إطار حتى تتعثّر اللعبة، فلا يُنشأ أي جسيم بعد الوصول إلى max. وخذ كل القيم العشوائية من rng التي تصل إلى الدالة، حتى يتكرّر الانفجار نفسه تمامًا في الاختبار.
المطلوب
اكتب emit(system, x, y, count, rng) لتضيف إلى system.particles عددًا من الجسيمات يصل إلى count انطلاقًا من النقطة (x, y) دون تجاوز system.max، ويكون كل جسيم من الشكل { x, y, vx, vy, life } وتأخذ سرعته واتجاهه وعمره من rng. ثم اكتب update(system, dt) لتحرّك كل جسيم بمقدار vx * dt وvy * dt، وتُنقص life بمقدار dt، وتحذف كل جسيم صار عمره صفرًا أو أقل.
الفحوص
6 فحوص- الدالة emit تضيف count جسيمًا من النقطة
- الدالة emit لا تتجاوز max
- الجسيم يتحرّك بمقدار سرعته × dt
- العمر ينقص بمقدار dt
- الجسيم المنتهي يُحذف دون تخطّي الذي يليه
- كل القيم العشوائية مأخوذة من rng