الدرس 8 من 10

كشف التصادم

هدف الدرس

مستطيلات ودوائر وحالة التلامس

01

الشرح

لا تفحص أغلب الألعاب التصادم بشكل الشخصية الحقيقي، بل بشكل بسيط يحيط بها، وهو مستطيل أضلاعه موازية للمحورين (AABB) أو دائرة، فيصير الفحص بضع مقارنات فقط، ويمكن إجراؤه لآلاف الكيانات في كل إطار.

ويتداخل المستطيلان حين يتداخل امتدادهما على x وعلى y معًا، فإن انفصلا على محور واحد فقط فهما غير متداخلين. ولا تبحث عن زاوية أحدهما داخل الآخر، فالمستطيلان اللذان يشكّلان صليبًا يتقاطعان دون أن تكون زاوية أيّ منهما داخل الآخر. أمّا الدائرتان فتتداخلان حين تقلّ المسافة بين مركزيهما عن مجموع نصفي قطريهما، وإن قارنت مربّعات الأطوال استغنيت عن math.sqrt.

وانتبه عند الحافّة، فإن كان الجدار يبدأ حيث ينتهي اللاعب تمامًا، فهل هما متصادمان؟ إن كتبت <= صار التلامس تصادمًا، فيصطدم اللاعب بالأرض التي يقف عليها في كل إطار، ويعلق عند الحدّ بين بلاطتين متجاورتين. والقاعدة هنا واضحة، فالتلامس ليس تداخلًا، والمقارنات كلها بـ< لا بـ<=.

02

المطلوب

اكتب aabbOverlap(a, b) لمستطيلين بالشكل { x, y, w, h }، وx, y فيه هي الزاوية العليا اليسرى، وcirclesOverlap(a, b) لدائرتين بالشكل { x, y, r }، وكلتاهما تُرجع true إن تداخل الشكلان، وfalse إن تلامسا أو تباعدا.

الفحوص

6 فحوص
  1. مستطيلان متداخلان جزئيًّا
  2. الانفصال على محور واحد يكفي لنفي التداخل
  3. المستطيلان المتقاطعان كالصليب متداخلان
  4. التلامس عند الحافّة ليس تداخلًا
  5. الدائرتان تُقاسان بالمسافة لا بالمحاور
  6. الدائرتان المتلامستان لا تتداخلان
03

تلميحات

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

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

–/6

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

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