الدرس 5 من 10

آلة الحالات

هدف الدرس

انتقالات واضحة وخطّافات للدخول والخروج

01

الشرح

الحارس في لعبتك إمّا واقف أو يطارد أو يهاجم، ولا يجمع بين حالتين في وقت واحد. وآلة الحالات (state machine) تعبّر عن هذا صراحة، فللحارس حالة واحدة في كل لحظة، ولكل حالة جدول بالحالات التي يُسمح بالانتقال إليها، فلا ينتقل من الوقوف إلى الهجوم مباشرة، بل يطارد أوّلًا.

وتبدأ ألعاب كثيرة بدلًا من ذلك بمتغيّرات منطقية متفرّقة مثل isChasing وisAttacking، ثم يظهر حارس يطارد ويهاجم في اللحظة نفسها لأن سطرًا ما نسي أن يُطفئ أحدهما. ولكل حالة خطّافان (hooks) اختياريّان، فالدالة enter تبدأ حركة الحالة أو صوتها عند الدخول إليها، والدالة exit تنظّف ما بدأته الحالة عند الخروج منها.

وانتبه إلى الترتيب، فتحقّق من أن الانتقال مسموح قبل أن تستدعي أي خطّاف، لأنك إن استدعيت exit ثم اكتشفت أن الانتقال ممنوع تركت الحارس في حالة الهجوم وقد أغمد سيفه. ثم استدعِ exit للحالة القديمة قبل enter للحالة الجديدة، وإلا نظّفت القديمة ما بدأته الجديدة للتوّ.

02

المطلوب

أكمل StateMachine:go(to)، فإن لم تكن to في جدول to الخاصّ بالحالة الحالية فأرجِع false دون أن تستدعي شيئًا، وإلا فاستدعِ exit للحالة القديمة إن وُجدت، ثم غيّر self.state، ثم استدعِ enter للحالة الجديدة إن وُجدت، وأرجِع true.

الفحوص

6 فحوص
  1. الانتقال المسموح يغيّر الحالة
  2. الانتقال الممنوع يُرجع false ولا تتغيّر الحالة
  3. الانتقال الممنوع لا يستدعي أي خطّاف
  4. الدالة exit للحالة القديمة تُستدعى قبل enter للحالة الجديدة
  5. الحالة تتغيّر بين الخطّافين
  6. الخطّافان اختياريّان
03

تلميحات

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

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

–/6

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

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