الدرس 2 من 10
الكيانات والمكوّنات
- 14 دقيقة
- 6 فحوص
- 3 تلميحات
- إلى المطلوب
هدف الدرس
حلقة تحديث تحذف الموتى بأمان
الشرح
كل ما في عالم اللعبة كيان (entity)، سواء كان لاعبًا أو وحشًا أو سهمًا أو صخرة. وفي Lua يكون الكيان جدولًا يجمع مكوّناته، مثل pos للموضع، وhp للصحّة، وspeed للسرعة. وليست كل المكوّنات في كل كيان، فالصخرة لها موضع وليست لها سرعة، والسهم يطير وليست له صحّة، ولذلك يتحدّد سلوك الكيان بالمكوّنات الموجودة فيه لا بنوعه.
وتُستدعى الدالة update(entities, dt) في كل إطار (frame)، كما تُستدعى love.update(dt) في LÖVE، وdt هو الزمن الذي مرّ منذ الإطار السابق بالثواني، وحين تضرب السرعة فيه يتحرّك الكيان بالمعدّل نفسه على الجهاز السريع والجهاز البطيء.
وانتبه عند حذف الكيانات الميّتة، فـtable.remove(entities, i) تزيح كل ما بعد i خانةً إلى الوراء، فإن كانت الحلقة تسير من الأول قفزت فوق الكيان الذي انتقل إلى مكان المحذوف، فينجو كيان ميّت من الحذف. شغّل الكود وانظر إلى الذئب. والحلّ أن تبدأ الحلقة من الآخر، for i = #entities, 1, -1، فلا تؤثّر الإزاحة إلا فيما مررت به.
المطلوب
أصلح update(entities, dt) لتزيد pos.x بمقدار speed * dt لكل كيان له speed، وتحذف من القائمة نفسها كل كيان صحّته hp صفر أو أقلّ، مع بقاء الكيانات الأخرى بترتيبها. والكيان الذي ليس له speed لا يتحرّك، والكيان الذي ليس له hp لا يُحذف.
الفحوص
6 فحوص- الكيان يتقدّم بمقدار speed * dt
- الكيان الذي ليس له speed يبقى مكانه
- الكيان الميّت يُحذف من القائمة نفسها
- الميّتان المتجاوران يُحذفان كلاهما
- الكيانات الباقية تحتفظ بترتيبها
- الكيان الذي ليس له hp لا يُحذف