الدرس 7 من 10

متّجهات بالجداول الوصفية

هدف الدرس

كتابة pos + vel * dt كما في الرياضيات

01

الشرح

الموضع والسرعة والقوّة في لعبة ثنائية الأبعاد كلها أزواج من x, y، وحين تكتبها أرقامًا منفصلة يتكرّر كل سطر مرّتين، فتكتب x = x + vx * dt ثم مثله لـy. أمّا الجدول الوصفي فيعلّم الجدول كيف يتعامل مع العمليات الحسابية، فإن عرّفت فيه __add صار a + b استدعاءً لها، وصار بإمكانك أن تكتب pos = pos + vel * dt كما في الرياضيات. وبهذه الطريقة يعمل Vector2 في Roblox وvector2 في FiveM.

وتُستدعى __mul أيًّا كان موضع الرقم، ففي v * 2 يصلها (v, 2)، وفي 2 * v يصلها (2, v)، لذلك انظر أيّ الطرفين هو الرقم. وكل عملية تُرجع متّجهًا جديدًا ولا تعدّل طرفيها، وإلا تحرّك الموضع الأصلي كلما حسبت منه نقطة.

وانتبه في normalize، فقسمة المتّجه الصفري على طوله هي 0 / 0، وهذه في Lua لا ترمي خطأ بل تعطي NaN، فتنتقل NaN إلى الموضع، وتصبح نتيجة كل مقارنة معها false، فيختفي الكيان من الخريطة ولا يصطدم بشيء. لذلك افحص الطول، فإن كان صفرًا فأرجِع متّجهًا صفريًّا.

02

المطلوب

أكمل Vector2 بالعمليتين __add و__sub، والعملية __mul لضرب المتّجه في رقم من أي جهة، والدوال length()، وnormalize() التي تُرجع متّجهًا طوله واحد، أو متّجهًا صفريًّا إن كان الأصل صفريًّا، وVector2.distance(a, b). وكل دالة تُرجع متّجهًا تُرجعه جديدًا بالجدول الوصفي نفسه.

الفحوص

6 فحوص
  1. عمليتا الجمع + والطرح - تحسبان x وy كلًّا على حدة
  2. الضرب في رقم من الجهتين
  3. الناتج متّجه جديد والأصل لا يتغيّر
  4. الدالتان length وdistance تحسبان الطول والمسافة
  5. ناتج normalize طوله واحد واتّجاهه نفسه
  6. الدالة normalize تُرجع متّجهًا صفريًّا للمتّجه الصفري لا NaN
03

تلميحات

0/3
main.lua
المخرجاتLua 5.4 (wasmoon)

نحمّل بيئة Lua الآن.

–/6

يبدأ الفحص حين تجهز البيئة.

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