الدرس 6 من 10

مولّد الأعداء

هدف الدرس

تجميع الزمن وحدّ أعلى لعدد الأعداء

01

الشرح

يظهر الأعداء في أغلب الألعاب بمؤقّت، فيأتي عدوّ جديد كل interval ثانية. والطريقة البسيطة التي تخطر أولًا هي if (timer >= interval) { spawn(); timer = 0; }، لكنها تجعل سرعة ظهور الأعداء مرتبطة بسرعة الجهاز دون أن تنتبه.

والسبب أن التصفير يضيّع الزمن الزائد على الفترة، وهذا الزائد يختلف من إطار إلى آخر، فيقلّ عدد الأعداء كلما طالت مدّة الإطارات. والصحيح أن تستعمل مجمّعًا للزمن، فتضيف إليه dt ثم تطرح منه interval بدل أن تصفّره، وتكرّر الطرح ما دام timer >= interval. ولهذا تستعمل while لا if، لأن إطارًا طويلًا بعد العودة من تبويب مخفي قد يحتوي ثلاث فترات، فيجب أن يظهر فيه ثلاثة أعداء.

ولا بد أيضًا من حدّ أعلى، فلا يزيد عدد الأعداء على max في وقت واحد. والزمن الذي يمرّ والعدد مكتمل يضيع ولا يُدّخر لما بعده، وإلا أخرج المولّد دفعة كبيرة من الأعداء بمجرّد أن يفرغ مكان.

02

المطلوب

اكتب updateSpawner(spawner, enemies, dt, rng) لمولّد من الشكل { timer, interval, max }، واصنع كل عدوّ جديد بالدالة الجاهزة makeEnemy(rng) مستعملًا rng التي وصلتك، ثم أضفه إلى enemies.

الفحوص

6 فحوص
  1. يظهر العدوّ عند اكتمال الفترة لا قبلها
  2. الزمن الزائد لا يضيع
  3. الإطار الطويل يُنشئ كل الأعداء التي فاتت
  4. عدد الأعداء لا يتجاوز max
  5. الزمن الذي يمرّ والعدد مكتمل لا يُدّخر
  6. العدوّ مصنوع بـ makeEnemy وrng نفسها
03

تلميحات

0/3
index.html
المعاينة
index.html100%
–/6

اضغط «تشغيل وتصحيح» ليبدأ الفحص.

تجد 6 فحوص في بطاقة «المطلوب».