Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Platformer
Gamedevelopment

بناء الضربات في صانع اللعبة، الجزء 2: المعركة والعدو الاساسي

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by Maryam Abbas (you can also view the original English article)

 ناقشنا في المقالة الأخيرة كيفية جعل اللاعب يتحرك ودمج بعض آليات القتال الأساسية. كانت هذه بداية جيدة، لكن ما زال أمامنا بعض الأشياء الأخرى التي يجب القيام بها قبل أن يبدو ذلك وكأنه لعبة حقيقية.

سوف تركز هذه المقالة على إنشاء كاميرا ديناميكية، مما يجعل منطقة المعركة أو ساحات المعركة تظهر، وإعطاء الأعداء القدرة على البدء في المقاومة.

كما هو الحال في المقالة الأخيرة، تأكد من تنزيل حزمة الأصول لهذه المقالة قبل البدء.

إنشاء الكاميرا

يستخدم صانع الألعاب طرق العرض للتحكم في كيفية تصرف الكاميرا. عادة ما يمكننا أن نخبر عرضنا أن يتبع "اللاعب" ونتركه هناك، ولكن في النهاية ستحتاج الكاميرا الخاصة بنا إلى سلوكيات خاصة مثل تأثير الاهتزاز بعد الهجمات الكبيرة. إذا كانت الكاميرا متصلة مباشرة باللاعب، فقد يكون تنفيذ ذلك صعبًا جدًا. بدلاً من ذلك، سنقوم بعمل كائن كاميرا يتبعه العرض، وبرمجة السلوكيات الخاصة به مباشرة.

دعونا أولا نستورد صورة متحركة للكاميرا. وهي موجودة في مجلد الأصول الذي تم تنزيله للبرنامج التعليمي ضمن صور> SPR_Camera.png.

اسم الصورة المتحركة  صور المنشأ
SPR_Camera  SPR_Camera.png  X = 14, Y = 12

على الرغم من أن الكاميرا ستكون غير مرئية، فسيكون هناك مشكلات في العرض  عند متابعتها إذا لم يكن لها رمز متحرك مرتبط بها، ولهذا السبب استوردنا هذه الصورة.

الآن دعونا نصنع كائن الكاميرا الفعلي.

  1. انقر بزر الماوس الأيمن فوق المجلد كائنات واختر إنشاء كائن.
  2. قم بتسمية الكائن OBJ_Camera.
  3. قم بإلغاء تحديد سمة مرئي.
  4. انقر فوق إضافة حدث> إنشاء.
  5. أضف التحكم في الإجراء> الرمز> تنفيذ الشيفرة.
  6. قم بإضافة الشيفرة التالية:

كل هذه الشيفرة هي لإعداد كائن الكاميرا لنا. أولاً، تخبر العرض بتتبع كائن الكاميرا. ثم تقوم بتعيين قيم الحافة العمودية و الحافة الافقية، والتي تحدد مدى قرب كائن الكاميرا من حافة العرض قبل أن يبدأ العرض بالتمرير مع المستوى. إذا كنت ترغب في بقاء الكاميرا / اللاعب في وسط الشاشة ، يجب أن تكون الحافة العمودية نصف ارتفاع شاشة اللعبة، ويجب أن تكون الحافة الافقية نصف عرض الشاشة. أخيرًا، يؤدي تعيين العرض مرئي إلى حقيقي إلى تنشيط هذا العرض داخل اللعبة.

بعد ضبط هذه القيم، نضع الكاميرا في نفس موضع اللاعب، وننشئ متغيرين TargetX و TargetY. سيتم استخدام هذه المتغيرات لتوجيه حركة الكاميرا وإخبارها إلى أين تذهب. ثم لدينا متغير الحالة الذي سيتم استخدامه للتحكم في سلوك الكاميرا. أخيرًا، يحدد MoveSpeed ​​سرعة انتقال الكاميرا إلى الموضع المستهدف.

سنقوم الآن بإضافة شيفرة الحركة الاساسية إلى حدث الخطوة.

  1. مع تحديد كائن الكاميرا، أضف حدث> خطوة> الخطوة.
  2. أضف التحكم في الإجراء> الشيفرة> تنفيذ الشيفرة.
  3. قم بإضافة الشيفرة التالية:

يخبر حدث الخطوة هذا الكاميرا أن تتبع اللاعب. أولاً، يقوم بتعيين الموقع المستهدف إلى موضع اللاعب. ثم، إذا كانت المسافة إلى موضع الهدف أكبر من سرعة حركة الكاميرا، فإنها تبدأ في التحرك نحو الهدف؛ وإلا ، فإنها تستقرعلى الوضع المستهدف وتتوقف.

هذا هو كل ما تحتاج إليه الكاميرا في الوقت الحالي، لذلك دعنا نضع كائن الكاميرا في اللعبة ونبدأ باختباره. يمكننا فقط أن نسقط الكاميرا في مجال اللاعب بأنفسنا، لكننا بدلاً من ذلك سنجعل كائن اللاعب ينشئ الكاميرا. نظرًا لأن الكاميرا تعتمد على "اللاعب" لتعمل، فإن امتلاك "اللاعب" للكاميرا يمنعنا من نسيان الكاميرا في المستقبل، ويضمن عدم وجود مشكلات في الترتيب الذي يتم إنشاء الكائنات فيه.

  1. انتقل إلى كائن اللاعب OBJ_Player.
  2. افتح الرمز الخاص بإنشاء الحدث.
  3. في نهاية الشيفرة، أضف سطر الشيفرة هذا:

وأخيرًا، نحتاج إلى تمكين المشاهدات داخل الغرفة، وإلا لن تعمل الكاميرا.

  1. اذهب إلى الغرفة 0، الغرفة التي صنعناها في البرنامج التعليمي الماضي.
  2. اذهب إلى علامة التبويب عرض.
  3. حدد تمكين استخدام طرق العرض.
  4. ثم حدد عرض 0 من قائمة عرض، وحدد المربع الذي يظهر مرئيًا عند بدء الغرفة.

إذا اختبرت اللعبة الآن، ستبدو الأمور كما كانت من قبل نظرًا لأن الغرفة تملأ المشهد تمامًا. لرؤية هذه التغييرات في العمل، نحتاج إلى جعل الغرفة أوسع أو أطول مما هي عليه الآن.

  1. اذهب إلى الغرفة 0، الغرفة التي صنعناها في البرنامج التعليمي الماضي.
  2. اذهب إلى علامة تبويب الإعدادات.
  3. عيّن العرض =3000.

الآن عندما تمضي في اللعبة، وتحاول المشي أمام الأعداء، يجب أن تلاحظ أن الغرفة تنتقل مع اللاعب أثناء حركته. من الناحية الفنية، يتم التمرير باستخدام الكاميرا، ولكن تبدو كما لو أنها تتبع "اللاعب" لأن هذا ما تفعله الكاميرا.

يمكنك أيضًا محاولة زيادة ارتفاع الغرفة، ويجب أن تشاهد تأثيرًا مشابهًا.

مناطق المعركة

في الضربات الكلاسيكية، يقتصر القتال عادة على منطقة والتي تكون شاشة واحدة أو شاشتين كبيرتين في كل مرة. عندما تبدأ المعركة، تصبح الكاميرا واللاعب مقيدين في المنطقة التي يحدث فيها القتال، ولا يمكن أن يتركاها حتى تنتهي المعركة. وهذا يسهل السيطرة على مواجهة العدو، ويسهل بناء AI، ويجعل القتال أكثر تركيزًا. إذا كنت لا تزال غير متأكد مما أتحدث عنه، فألقِ نظرة على لعبة Let’s Play of Castle Crashers هذه، وشاهد ما يحدث عندما يدخلون إلى القتال.

عندما يبدأ القتال، تصبح حركتهم مقيدة، وفي بعض الحالات تتغير سلوكيات الكاميرا. من الصعب ملاحظة ذلك عندما لا تبحث عنه، لكن الكاميرا تميل إلى "الانجذاب" قليلاً إلى منطقة القتال بمجرد بدء المعركة. لإنشاء هذا التأثير في لعبتنا، سنقوم بإضافة كائن منطقة المعركة الذي سيكون بمثابة نوع من الساحة للمعركة التي ستجري فيها. بمجرد دخول اللاعب إلى منطقة المعركة، سوف يستولي على الكاميرا ويقيّد حركتها حتى تنتهي المعركة.

نحتاج أولاً إلى صورة متحركة لمنطقة القتال لدينا.

  1. انقر بزر الماوس الأيمن على مجلد صور متحركة واختر انشاء صورة متحركة جديدة.
  2. اسمي الصورة المتحركة SPR_منطقة المعركة.
  3. انقرفوق تحرير الصورة المتحركة.
  4. اذهب إلى ملف> جديد.
  5. في مربع الحوار جديد، عيّن حجم الصورة إلى 1024x768، واضغط على موافق. لقد اخترت حجم الصورةهذا لأن هذه هي الدقة الفعلية للعبتنا. نظرًا لأن منطقة المعركةs سيكون قابلًا لتغيير حجمه، فإن الحجم الافتراضي وهو حجم الشاشة سيكون مناسبًا جدًا لتصميم المواجهات بسرعة.
  6. انقر نقرًا مزدوجًا فوق الصورة الجديدة لفتح محرر الصور.
  7. استخدم دلو الطلاء لتعبئة الصورة بأكملها بلون واحد. لن تكون مناطق المعارك مرئية في اللعبة، لذا يمكنك اختيار أي لون تريده هنا. فقط تأكد من اختيار اللون الذي سيكون من السهل رؤيته وواضح عند تحرير المستوى. لقد اخترت الأزرق الساطع.
  8. استخدم علامة التدقيق لحفظ الصورة المتحركة.
  9. قم بتمركز النقطة المحورية.
  10. اضغط على موافق لحفظ الصورة المتحركة والخروج من محرر الصور المتحركة.

بعد ذلك سنصنع كائن Battle Region.

  1. انقر بزر الماوس الأيمن فوق المجلد كائنات واختر إنشاء كائن.
  2. اسمي الكائن OBJ_منطقة المعركة.
  3. عيّن الصورة المتحركة على SPR_منطقة المعركة.
  4. ألغِ تحديد مربع الاختيار مرئي.
  5. انقر فوق إضافة حدث> إنشاء.
  6. أضف التحكم في الإجراء> الشيفرة> تنفيذ الشيفرة.
  7. قم بإضافة الشيفرة التالية:

هذه هي شيفرة الانشاء لدينا. يخبرنا متغير IsActive ما إذا تم تنشيط منطقة المعركة. بمعنى آخر، يخبرنا ما إذا كانت المعركة قد بدأت، وما إذا كان الأعداء في المنطقة لا يزالون على قيد الحياة. يبدأ الأمر كاذبًا، ولكن سيصبح صحيحًا عندما يدخل اللاعب ويبقى صحيحًا حتى يقتل كل الأعداء. يقدم لنا ارتفاع المنطقة و عرض المنطقة متغيرات للوصول إلى حجم منطقة المعركة، في حين أن المتغيرات الأربعة بعد ذلك تخبرنا بالضبط أين توجد الحواف.

سوف ننتهي من حاجتنا لهذه القيم بشكل كبير، لذا سنكون قادرين على الرجوع إليها بسهولة، دون القيام بالحسابات في كل مرة، ستكون مساعدة كبيرة في وقت لاحق. أخيراً، HasEnemies هو تابع منطقي بسيط سيخبرنا ما إذا كانت المنطقة قد بقي أي أعداء أحياء فيها. بمجرد تنشيط منطقة المعركة، فلن يكون من الممكن إلغاء التنشيط إلا إذا كان هذا المتغير خاطئًا.

بعد ذلك سنضيف شيفرة لتنشيط منطقة المعركة عندما يدخل اللاعب.

  1. في OBJ_منطقة المعركة، انقر فوق إضافة حدث> تصادم> OBJ_Player.
  2. أضف التحكم في الإجراء> الشيفرة> تنفيذ الشيفرة.
  3. قم بإضافة الشيفرة التالية:

وعلى الرغم من أن العبارة if في هذه الشيفرة طويلة جدًا، فهي في الواقع تختبر شيئين فقط. أولاً، تختبر إذا كان "اللاعب" ضمن حدود منطقة المعركة، ولكنه يتجاهل حاجزًا صغيرًا يبلغ حوالي 20 بكسل على الحافة الداخلية لـ منطقة المعركة. وتقوم بذلك للتأكد من أن اللاعب موجود بالكامل داخل المنطقة، ولا يقف على الحافة الحقيقية قبل تنشيطه. الشيء الثاني الذي تتحقق منه هو ما إذا كان HasEnemies صحيح. إذا كان كلاهما صحيحًا، فإنها تنشط منطقة المعركة.

وأخيرًا، نحتاج إلى تعطيل منطقة المعركة عند انتهاء القتال، والتأكد من تعيين HasEnemies على صحيح عندما يكون هناك أعداء في المنطقة. يمكننا القيام بذلك في حدث الخطوة.

  1. في OBJ_منطقة المعركة، انقر فوق إضافة حدث> خطوة.
  2. أضف التحكم في الإجراء> الشيفرة> تنفيذ الشيفرة.
  3. قم بإضافة الشيفرة التالية:

تتحقق هذا الشيفرة مما إذا كان هناك أي أعداء متبقين في الغرفة، وإذا كان هناك أي أعداء يقعون في منطقة المعركة. إذا كان كلاهما صحيحاً، فإنه يقوم بتعيين HasEnemies إلى صحيح؛ بخلاف ذلك، فإنه يضعها على كاذبة وتعطل منطقة المعركة.

آخر شيء يجب عليك فعله هو إضافة منطقة المعركة إلى المستوى، واختبار اللعبة لمعرفة ما يحدث. عند إضافتها، تأكد من أن الأعداء الذين قمت بوضعهم هم ضمن حدود منطقة المعركة. يمكنك أيضًا الحصول على مناطق معركة متعددة، ولكن يجب التأكد من عدم تداخلها. يمكنك أن ترى كيف أقوم بإعداد منطقة المعركة أدناه:

The Battle Region

تقييد حركة اللاعب

إذا ذهبت في اللعبة لاختبار منطقة المعركة الخاصة بك، ربما لاحظت أن شيئا لم يحدث عندما دخلت منطقة المعركة. وذلك لأن أيًا من الحركة أو شيفرة الكاميرا لا تتغير عندما تكون منطقة المعركة نشطًة. حتى الآن، فإن تفعيل منطقة المعركة هو في الأساس عمل عديم الفائدة لأننا لا نخبر أيًا من الكائنات الأخرى أن تفعل أي شيء حيال حقيقة أنها نشطة. لإصلاح هذا، نحتاج إلى ضبط كائنات اللاعب و الكاميرا بحيث يتم حساب حدود منطقة المعركة عندما تكون نشطة.

بالنسبة للاعب، نريد التأكد من أنهم لا يستطيعون مغادرة منطقة المعركة حتى يتم هزيمة كل أعدائهم. للقيام بذلك، نحن بحاجة إلى تعديل شيفرة الحركة نفسها.

  1. اذهب إلى OBJ_Player.
  2. انتقل إلى حدث الخطوة للاعب .
  3. في بداية حدث الخطوة للاعب، أضف هذه الشيفرة:

تخزن هذا الشيفرة أقرب منطقة معركة في المتغير بحيث يمكن للاعب الإشارة إليه بسهولة ضمن شيفرة الحركة.

  1. لا نزال في حدث الخطوة OBJ_Player.
  2. أضف التعليمات البرمجية التالية في بداية العبارة IsAttacking if ، قبل أي من التعليمات البرمجية الموجودة في عبارة if تلك:

وعلى الرغم من أن هذه الشيفرة تبدو طويلة، فهي بسيطة جدًا حقًا. أولاً تتحقق ما إذا كانت منطقة المعركة نشطة. إذا كان الأمر كذلك، فإنها تنظر إلى وضع X المحتمل للاعب استنادًا إلى XSpeed ​​الخاص به. إذا كانت سرعتها الحالية ستضعها خارج منطقة المعركة، أو تتسبب في اصطدامها بجسم مميز بـ صلب، فستقوم بتعيين XSpeed ​​إلى 0. ثم تقوم بنفس عملية التحقق من YSpeed.

إذا ذهبت في اللعبة واختبرت هذه الشيفرة الجديدة، يجب أن تقتصر حركتك على حدود منطقة المعركة حتى تقتل كل الأعداء.

سلوكيات الكاميرا: مقدمة إلى ماكينات الحالة المحدودة

الأمور لا تزال غير مثالية، مع ذلك. على الرغم من أن اللاعب لا يمكنه الخروج من منطقة المعركة، يمكن للكاميرا ذلك. وبسبب هذا، إذا ذهبنا إلى حافة منطقة المعركة، فمن الواضح أن اللاعب يضرب جدارًا غير مرئي في منتصف الشاشة، ولا يمكنه التحرك إلى أبعد من ذلك، ولكن لا يزال الجزء الخارجي من منطقة المعركة ظاهرًا.

The visible Battle Region

من الواضح أنه سيكون من الأفضل أن يتم تقييد الكاميرا بنفس الطريقة التي تم بها تقييد "اللاعب"، ولن تتمكن من الانتقال إلى موقع حيث ترى حواف منطقة المعركة. للقيام بذلك، سنقوم بإعداد "آلة الحالة المحدودة"، أو FSM، والذي سيسمح لنا بفرض كيف تتصرف الكاميرا استنادًا إلى الحالة الحالية للعبة.

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

بالنسبة لكاميراتنا، سنصنع حالتين: اللاعب والمنطقة. سيتبع اللاعب اللاعب عن كثب قدر المستطاع عندما لا يكون في المعركة، وسيقوم بشكل أساسي بكل ما تفعله الكاميرا الآن. سوف تتولى المنطقة المسؤولية عندما يدخل اللاعب إلى منطقة المعركة نشطة، وستتأكد من أن الكاميرا لا يمكنها تجاوز حدود المنطقة، مع الإبقاء على اللاعب في وضع العرض في جميع الأوقات.

لدينا بالفعل متغير الحالة في الكاميرا، منذ أن أنشأناه في وقت سابق، لذلك يمكننا الانتقال مباشرة إلى بناء FSM الفعلي.

  1. اذهب إلى OBJ_Camera.
  2. افتح رمز حدث الخطوة.
  3. استبدل الرمز الذي يحدد TargetX و TargetY بما يلي:

ستحدد هذه الشيفرة البنية الأساسية لحدث الخطوة الجديد. أولاً، تعثر الكاميرا على أقرب منطقة المعركة وتخزنها في متغير يسمى MyBR، تمامًا مثل اللاعب. ثم تنظرعبارة التبديل إلى الحالة وتقوم بتشغيل التعليمة البرمجية المناسبة.

في حين أن هذه هي عبارة تبديل بسيطة للغاية، ويمكننا تحقيق شيء مماثل مع عبارة if، فإننا سنحتاج في النهاية إلى مزيد من الحالات، لذا من الجيد التفكير المسبق والقيام  بعبارة التبديل الآن.

أولاً، دعنا نضيف الشيفرة لحالة اللاعب. أضف هذا الكود مكان التعليق في حالة اللاعب:

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

بعد ذلك، سنضيف السلوكيات لحالة المنطقة. الهدف من هذه الحالة هو إبقاء الكاميرا ضمن حدود منطقة المعركة في جميع الأوقات والتأكد من أنه أينما ذهب اللاعب داخل المنطقة، فسيكون مرئيًا. للقيام بذلك، سنحدد الحد الأدنى والحد الأقصى لموضع X و Y الذي يمكن أن تذهب إليه الكاميرا قبل أن يصبح السطح الخارجي لـ منطقة المعركة مرئيًا.

ثم، إذا كان "اللاعب" ضمن هذه المساحة الدنيا / القصوى، فستتبعه الكاميرا بالطريقة المعتادة، وإذا خرج اللاعب من تلك المنطقة، إلى حواف منطقة المعركة، ستظل الكاميرا قادرة على رؤيته عندما يصل إلى الحد الأدنى / الحد الأقصى.

استبدل تعليق حالة المنطقة بالشيفرة التالية:

أولاً يحدد هذا الرمز الحد الأدنى والحد الأقصى لموضع X و Y للكاميرا، من خلال أخذ حواف منطقة المعركة وإضافة عازل يمثل نصف ارتفاع الشاشة وعرضها على جميع الجوانب. هذا العازل يسمح للكاميرا الاقتراب قدر الإمكان من حافة المنطقة، دون جعل أي شيء خارج منطقة المعركة مرئياً. يمكنك أن ترى ما أعنيه في الصورة أدناه.

Camera Placement

في هذه الحالة تمثل المناطق الزرقاء منطقة المعركة، ويمثل المربع ذو المخطط الأحمر الكاميرا. المنطقة الزرقاء الداكنة هي المنطقة العازلة، في حين أن المنطقة الزرقاء الفاتحة هي المنطقة التي يمكن للكاميرا أن تتحرك فيها بحرية. وكما ترى، فإن مركز الكاميرا يتقابل تماماً مع حافة العازل عندما تكون على حافة منطقة المعركة.

بعد ذلك، تستخدم الكاميرا وظيفة المشبك لتعيين TargetX و TargetY استنادًا إلى موضع اللاعب، والحد الأدنى، والحد الأقصى. أخيرًا، تختبر لمعرفة ما إذا كانت منطقة المعركة لا تزال نشطة، أو ما إذا كانت الكاميرا قد خرجت خارج حدود منطقة المعركة، وتعيد الحالة إلى Player إذا كان أي منهما صحيحًا.

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

أفضل طريقة لرؤية الكاميرا أثناء العمل، هي جعل عرض أو ارتفاع منطقة المعركة أكبر من عرض أو ارتفاع الشاشة. إذا لم تقم بتغيير حجم منطقة المعركة، وتركته بنفس حجم عرض الكاميرا، فلن تتحرك الكاميرا مطلقًا عندما تكون منطقة المعركة نشطًة لأن حجم منطقة المعركة يساوي بالضبط حجم الشاشة.

بعد الانتهاء من اختبار سلوكيات الكاميرا، يجب الرجوع إلى OBJ_منطقة المعركة وإلغاء تحديد مربع الاختيار مرئي. بهذه الطريقة لن تكون منطقة المعركة مرئية في اللعبة.

العدو الأساسي AI

الضرب على الأعداء العزل أمر ممتع، ولكن لعبتنا تحتاج إلى أكثر من أكياس اللكم المبجلة لتكون ممتعة. على أقل تقدير، يجب أن نعطيهم القدرة على ضربنا.

بالنسبة إلى AI، سنستخدم آلة حالة محدودة أخرى. يمكن أن تشمل حالات أعدائنا التجول / الدوريات عندما لا يكون لديهم هدف، أو الاصطفاف عندما يستعدون للهجوم، أو عندما لا يفعلون شيئًا على الإطلاق. الحالات التي سنبدأها اليوم هي Idle, و PositionFront, و PositionBehind.

لن يتم إكمال PositionFront و PositionBehind اليوم، ولكن سيتم استخدامها في مقالة لاحقة لتحديد الاتجاه الذي سيقترب منه الأعداء من اللاعب.

قبل البدء في إنشاء هذه الحالات، سنحتاج إلى استيراد صورتين متحركتين جديدتين سنستخدمهما في هجمات العدو. ستكون أحدهما لـ الهجوم الأساسي، وواحدة للهجوم القوي. أنشئ رمزين متحركين جديدين كما هو موضح أدناه:

اسم الصورة المتحركة صور صور المنشأ
SPR_EnemyBasicPunch

RedEnemyBasicPunch1.png,

RedEnemyBasicPunch2.png,

RedEnemyBasicPunch3.png,

,RedEnemyBasicPunch4.png

RedEnemyBasicPunch5.png

X = 55,  Y= 122
SPR_EnemyStrongPunch
,RedEnemyStrongPunch1.png

,RedEnemyStrongPunch2.png

,RedEnemyStrongPunch3.png

,RedEnemyStrongPunch4.png,

RedEnemyStrongPunch5.png
X = 60 ,  Y = 124

نحتاج أيضًا إلى إعطاء العدو متغير حالة، ومتغير مدى الرؤية بحيث نعرف مدى قربهم عندما "يلاحظهم" اللاعب.

  1. انتقل إلى إنشاء حدث للعدو.
  2. أضف هذه المتغيرات في نهاية الشيفرة:

يجب أن تلاحظ أن الحالة الأولية للعدو هي غير نشطة. هذه الحالة ستعمل أساسًا كحالة "إيقاف" للعدو. من خلال عدم تضمين حالة له في عبارة التبديل، فإننا نضمن أنه حتى يقوم العدو بالتبديل إلى إحدى حالاته "النشطة"، فإنه لن يتخذ أي إجراءات. في هذه الحالة، سوف ينتقلون إلى حالة نشطة عندما يدخل اللاعب إلى منطقة المعركة يكونون في داخلها.

عبارة التبديل

بعد ذلك، سنضيف عبارة تبديل، تشبه عبارة الكاميرات، إلى حدث الخطوة للعدو.

اتبع هذه الخطوات:

  1. اذهب إلى حدث الخطوة للعدو.
  2. بعد عبارة if التي تتحقق للتأكد من أن العدو ليس ميتًا، استبدل الشيفرة التي تضبط رمز العدو بالشيفرة التالية:

هذه عبارة عن غلاف أساسي لعبارة التبديل لدينا والتي سنوسعها بمرور الوقت؛ ومع ذلك، فإنه لا يزال يقدم لنا فكرة جيدة عن كيفية عمل عبارة التبديل النهائية. الآن الكثير من هذا الشيفرات هي مجرد تعليقات، لكننا سنستبدلها قريباً، كما فعلنا سابقاً.

قبل تشغيل عبارة Switch فعليًا، يتحقق العدو ما إذا كان يجب عليه التبديل إلى حالة مختلفة عن الحالة التي يستخدمونها حاليًا. ثم ننتقل إلى عبارة التبديل نفسها.

الحالة الأولى هي الحالة الكسولة، والتي تقوم في الأساس بتحريك العدو والتحقق مما إذا كان ينبغي عليه محاولة الهجوم عشوائياً. لذا إذا حدث تشغيل اللاعب من قبلهم، فهناك احتمال أن يهاجموا مع مرور اللاعب. الحالتان الثانية والثالثة هي طرق هجومنا الحقيقية. هذه الحالات تخبر العدو أن يأخذ موضع إما أمام أو خلف اللاعب ويستعد للهجوم.

في الوقت الحالي لا تقوم حالاتنا بأي شيء نظرًا لأنها مجرد تعليقات، ولكن إذا ألقيت نظرة فاحصة على التعليقات، يجب أن تلاحظ شيئًا مثيرًا للاهتمام. من هو المسؤول عن الصور، ومع من سوف يتصلون إذا كانوا يريدون معرفة المزيد.موضوع التصويرالمستجيب من قبل ثيمغودز يقدم تخطيط الصفحة الرئيسية التي تفعل هذا بشكل جيد حقا. اسمك، توقيعك، لمسة من شخصية المتابعة والمحور. نظرًا لأن هذه الكودات البرمجية ستكون مطلوبة عدة مرات، سنقوم بإجراء أحداث مخصصة للتعامل مع هذه الإجراءات بالنسبة لنا. بهذه الطريقة لا نضطر لإعادة كتابة الشيء نفسه مرارًا وتكرارًا.

اختيار الحالة / السلوك الجديد

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

للحصول على فكرة عن كيفية قيام العدو بتحديد ما يجب فعله بعد ذلك، ألق نظرة على مخطط الحالة أدناه:

State Diagram of the Enemy AI

يشرح مخطط الحالة هذا كيف ستعمل التكرارية الأولى لعدونا AI. بكل بساطة، سيبدأ العدو في الحالة الخاملة بمجرد بدء المعركة. إذا كان العدو داخل المدى المنظور من "اللاعب"، فسيتحول بشكل عشوائي إلى PositionBehind أو PositionFront.

هذا هو AI ببساطة، ولكننا سوف نتوسع فيها ونحن ندخل في هذه السلسلة.

لصنع الحدث، اتبع الخطوات التالية:

  1. في OBJ_Enemy، اختر إضافة حدث> آخر> مستخدم محدد> المستخدم 0.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. أضف الشيفرة التالية:

كما ترون، يستخدم هذا الحدث عبارة التبديل لتحقيق ما شرحته أعلاه. أولاً يقوم بإنشاء متغيرعشوائي يسمى MyAction والذي سيستخدمه لتحديد حالة جديدة في الحالات التي توجد بها عدة خيارات متاحة. بعد ذلك، في عبارة التبديل، إذا كانت حالة العدو معطلة، وكان اللاعب ضمن مجال الرؤية، فإن لديهم فرصة 50٪ للتبديل إلى PositionBehind، وإمكانية 50٪ للتبديل إلى PositionFront.

في الوقت الحالي، هذا كل ما نحتاج إلى القيام به.

انتقل الآن إلى حدث الخطوة مرة أخرى، واستبدل التعليق الذي يقول // اختر حالة جديدة تستند إلى ... باستخدام الشيفرة التالية:

نحن قريبون جدا من وجود شيفرة العمل، ولكننا لا نزال بحاجة إلى إضافة الشيفرة التي تنشط الأعداء في منطقة المعركة عندما تبدأ المعركة. اتبع هذه الخطوات للقيام بذلك:

  1. في OBJ_منطقة المعركة، اختر إضافة حدث> تضارب> OBJ_Enemy.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

تعمل هذه الشيفرة عندما يكون هناك تصادم بين العدو و منطقة المعركة، وتتحقق ما إذا كانت منطقة المعركة نشطة، وما إذا كان العدو غير نشط. إذا كان كل من هذين الأمرين صحيحًا، فإنها تنشط العدو من خلال تعيين حالته إلى الخمول.

إذا انتقلت إلى اللعبة الآن، فستعمل الشيفرة تقنيًا، ولكن لن يكون لها أي تأثير مرئي. وذلك لأن الحالات الفعلية لا تزال مجرد تعليقات تشرح ما تفعله، وليست الكود الفعلي.

للتحقق من أنها تعمل، ورؤيتها مؤثرة، سنضيف شيفرة تصحيح الأخطاء مؤقتًا إلى نهاية حدث جر العدو.

ستكتب هذه الشيفرة حالة العدو أسفل الرمز المتحرك للعبة، ويوضح مايحدث على الفور.

الآن عندما تدخل منطقة المعركة، يجب أن ترى تغيير حالة العدو من غير نشط، إلى كسول، ثم فورًا إلى PositionFront أو PositionBehind.

الهجوم

يعتبر اختيار الحالة بداية جيدة، ولكن المقاومة تتطلب من العدو التحقق مما إذا كان ضمن نطاق اللاعب، وما إذا كانوا مستعدين لمهاجمته. لهذا، سنستخدم متغيرًا باسم مدى الهجوم، وواحدًا يسمى العدوانية. يخبرنا مدى الهجوم عن كم يحتاج العدو أن يكون قريباً لتنفيذ الهجوم، في حين ستبدأ العدائية عند 0، وتزداد ببطء استنادًا إلى حالة العدو. كلما زادت النسبة، كلما زاد احتمال قيام العدو بالمهاجمة، واستخدام هجمات أكثر قوة عندما يفعلون.

لإضافة هذه المتغيرات، عُد إلى إنشاء حدث العدو، وأضف هذا الكود إلى نهاية الحدث:

الآن، لكي نجعل هجماتنا تعمل، نحتاج إلى إضافة ثلاثة أحداث أخرى إلى العدو: أحد الأحداث يحدد موعد الهجوم، وحدث آخر ينفذالهجوم، وحدثًا ثالثاً يعيد وضع حالة العدو بعد الهجوم. لنبدأ بالحدث لمعرفة ما إذا كان يجب أن يهاجموا:

  1. في كائن العدو، اختر إضافة حدث> آخر> مستخدم محدد> مستخدم 1.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

هذا الحدث بسيط جدا. أولاً يتفحص ما إذا كان العدو على الأرض، لأنه ليس لديه أي هجمات جوية. ثم يتحقق مما إذا كان اللاعب قريب بما فيه الكفاية للهجوم على أساس المسافة بينهما، وما إذا كانوا على نفس الطبقة. إذا كانوا قريبين بما يكفي للهجوم، والعدو على الأرض، تزداد عدوانيتهم، ولديهم فرصة للهجوم.

الآن دعونا نصنع أحداث الهجوم نفسها، بحيث يكون لدينا حدث نستدعيه عندما يقرر العدو الهجوم.

  1. في كائن العدو، اختر إضافة حدث> آخر> مستخدم محدد> مستخدم 2.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

بالنسبة إلى هذا الحدث، طالما لم يكن اللاعب ميتًا، تنشئ الشيفرة رقمًا عشوائيًا يسمى فرصة الهجوم. يستخدم هذا الرقم مع عدوانية العدو لتحديد ما إذا كان العدو يجب أن يستخدم هجومًا خفيفًا أو هجومًا قويًا. إذا كانت كلا من العدوانية و فرصة الهجوم مرتفعتين نسبيًا، فإن العدو يستخدم هجومًا قويًا؛ على خلاف ذلك يستخدمون هجوم خفيف.

بعد ذلك، يتم ضبط سرعة العدو على 0 حتى لا يتحركوا أثناء الهجوم، ويضع حالة العدو على الهجوم، ويعيدضبط عدوانيتهم ​، ويطابق الخصائص الأساسية للهجوم إلى الخصائص المناظرة للعدو.

قبل أن نذهب إلى أبعد من ذلك، دعنا نرى كيف تعمل الأشياء حتى الآن. انتقل إلى حدث الخطوة للعدو واستبدل جميع حالات التعليق // تحقق لمعرفة ما إذا كان يجب على العدو الهجوم بالشيفرة التالية:

انتقل الآن إلى اللعبة، وقف بالقرب من العدو لبضع ثوان. احصل على شيء ضدهم ولنرى ما سيحدث. يجب أن يبدؤوا في النهاية بالهجوم، وعندما يفعلون ذلك، يجب أن تراقبوا حالتهم وصورهم المتحركة. إذا لم تكن متأكدًا من مدى قربك منهم، استخدم هذه الصورة كمرجع:

The position of the enemy

يجب أن تلاحظ أنه بمجرد أن يبدأ العدو في الهجوم، فإنهم لا يتوقفون أبداً. يبدو أن الرسوم المتحركة تستمر إلى الأبد، ولا تصبح حالتهم خاملة أبدًا مرة أخرى. هذا لأن الرسوم المتحركة والحالة للعدو لا تتم إعادة ضبطهما بعد بدء الهجوم؛ هذا يشبه مشكلة واجهتنا مع "اللاعب". إذا كنت تفكر في كيفية معالجة الشيفرة، فإن آخر شيء فعلناه مع الرسوم المتحركة للعدو كان اختيار أحد الهجومين، وآخر شيء فعلناه مع حالتهم هو تعيينه على "مهاجمة". على الرغم من أن هجماتنا تعمل حاليًا، بدون ثلث الأحداث التي ذكرتها أعلاه، فإن العدو لا "يضعف" مطلقًا ويعاود العودة إلى التباطؤ.

أسهل طريقة لإعادة تعيين العدو هي عن طريق إضافة حدث انتهاء الحركة. سيتم تشغيل هذا الحدث عند اكتمال الحركة، وسيتحقق مما إذا تم تعيين حالة العدو على الهجوم. إذا كان الأمر كذلك، فسيؤدي ذلك إلى العودة إلى الحالة الافتراضية، وتبديل الحركات. لذلك في السيناريو أعلاه، في اللحظة التي تنتهي فيها أول حركة للهجوم، سيتم تشغيل هذا الحدث وإعادة تعيين كل شيء بحيث لا تتم إعادة تشغيل الحلقة.

  1. في كائن العدو اختر إضافة حدث> آخر> إنهاء الحركة
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

وكما قلت، فإن الشيفرة تتحقق مما إذا كانت حالة العدو "مهاجمة"، وإذا كان الأمر كذلك فإنها تعيد تعيين حالتهم إلى حالة الخمول.

انتقل الآن إلى اللعبة مرة أخرى، وشاهد ما يحدث عندما تفعل الشيء نفسه كما كان من قبل. يجب أن تشاهد الآن إعادة تعيين الحالة إذا كنت تشاهد النص تحت العدو، ولكن ستظل الحركة مستمرة إلى الأبد. تكمن المشكلة في أننا لم نضف بعد أي شفيرة لتحريك العدو استنادًا إلى حالتهم. هذا ما سنفعله بعد ذلك.

تحريك العدو

الحركة الوحيدة التي نحتاجها الآن هي أن يقوم العدو بالرجوع إلى رمز الخمول بعد انتهاء هجومه. على الرغم من أنه يمكننا فقط إضافة هذه الشيفرة إلى حدث نهاية الحركة، أو حتى إلى حالة الخمول في حدث الخطوة، فسنحتاج في النهاية إلى مزيد من التحكم الدقيق في حركة العدو.

ولهذا السبب، سنصنع حدثًا جديدًا آخر للتعامل بشكل خاص مع الحركة. في الواقع، إذا نظرت إلى حدث الخطوة الخاص بنا، فسترى في الشيفرة التي تم التعليق عليها أن لدينا بالفعل مكانين لوضع هذا حدث الحركة هذا حالما نصنعه.

  1. في كائن العدو، اختر إضافة حدث> آخر> مستخدم محدد> مستخدم 3.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة الشيفرة التالية:

حتى الآن، يتم تعيين كل هذه الشيفرة لحركة العدو على خمول بغض النظر عن حالته. في نهاية المطاف، سنضيف شيفرة تقوم بإعداد حركة المشي أثناء تنقلهم، وحتى بعض الحركات المتخصصة التي لا تنطبق إلا على أحداث معينة.

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

إذا عدت إلى اللعبة في هذه المرحلة، يجب أن ترى أن مشكلة الحركة لدينا قد تم حلها، وأن العدو يقوم بتبديل الحالات بشكل صحيح.

إضافة شريط الصحة

يبدو أن هجمات العدو الآن تعمل، ولكن قد تلاحظ مشكلة إذا سمحت لهم بضربك عدة مرات. لا يهم كم من الوقت تقف بجانب العدو وتتركهم يضربونك، لا يبدو أنك تموت. علاوة على ذلك، لا نعرف حتى ما إذا كنت تفقد الصحة بعد. بما أن هذا مهم جدًا للتحقق من أن هجمات العدو تعمل، فهذا ما سنفعله بعد ذلك.

قبل أن نتمكن من معرفة سبب عدم موتك، نحتاج إلى معرفة ما إذا كنت ستتأذى، لذلك دعنا نضيف شريطًا صحيًا للاعب. للقيام بذلك، سنقوم بإعطاء اللاعب الحدث Draw GUI.

  1. في كائن العدو، اختر إضافة حدث"> رسم> رسم GUI.
  2. أضف التحكم في الإجراء> الشيفرة> تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

لا تعمل هذه الشيفرة كثيرًا، ولكن يجب أن تعطينا شريطًا صحيًا أساسيًا لشخصيتنا. أولًا ترسم مستطيلًا أسودًا بسيطًا لاستخدامه كمخطط تفصيلي لـشريط الصحة. بعد ذلك، فإنها ترسم مستطيل كستنائي ليعمل كخلفية عندما يفقد اللاعب بعض الصحة. أخيرا، إذا كان اللاعب لا يزال يتمتع بصحة جيدة، فإنه يرسم شريط أخضر للصحة نفسها.

يتم تعيين عرض الشريط الأخضر بضرب أقصى عرض لشريط الصحة وهو 242 بكسل بالكسر CurrentHP / MaxHP. وبهذه الطريقة سيكون شريط الصحة الأخضر دائمًا بحجم يتناسب مع كمية الصحة التي لدى اللاعب.

إذا انتقلت إلى اللعبة الآن، فيجب أن ترى شريط "الصحة" في الزاوية العلوية اليسرى:

The HealthBar in the top-left corner of the dashboard

إذا صعدت إلى العدو مرة أخرى وبدأ بمهاجمتك، يجب أن يكون من الواضح الآن أنك تتعرض للضرر.

إعادة تعيين IsHit الخاصة باللاعب

على الرغم من حقيقة أننا نعرف أن اللاعب قد تعرض للضرب، فإن الأمور لا تزال غير مثالية. اذهب في اللعبة، وحاول مهاجمة العدو أو التحرك بعد تعرضك لإحدى هجماته. على الرغم من أن عناصر التحكم الخاصة بك تعمل بشكل جيد قبل أن تضرب، فإنه في اللحظة التي تتعرض فيها للضرر، فإنك لن تعود قادرًا على الحركة أو الهجوم.

يحدث هذا لأن شيفرة الهجوم الخاصة باللاعب في المستخدم المحدد 2، وشيفرة حركته في حدث الخطوة يتطلب كلاهما أن تكون IsHit كاذبة. يمكنك الاطلاع على المستخدم المحدد 2 أدناه:

IsHit in the Attack Event

على عكس عدونا، إذاً بعد إصابة اللاعب، فإننا لم نقم أبدًا بإعادة ضبط متغير IsHit. لذلك دعونا نضيف حدث إنذار للقيام بذلك.

إذا نظرت مرة أخرى إلى شيفرة تصادم OBJ_ATK الخاص باللاعب، فسترى أن لدينا بالفعل شيفرة بدلاً منها لتشغيل حدث إنذار وصعق اللاعب.

Existing StunLength code

لذلك فإن الشيء الوحيد الذي يتعين علينا القيام به في هذه المرحلة هو إضافة بعض التعليمات البرمجية لإعادة تعيين IsHit، وإعطاء اللاعب حركة IsHit.

  1. مع OBJ_Player، اختر إضافة حدث> إنذار> إنذار 3.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:
  1. مع OBJ_Player، انتقل إلى حدث الخطوة.
  2. افتح الشيفرة لحدث الخطوة.
  3. أضف هذه العبارة else إلى نهاية العبارة if التي تشغل شيفرة حركة اللاعب.

يجب أن تظهر شيفرة الحركة الخاصة بك الآن هكذا، مع تحديد الجزء الجديد باللون الأحمر:

Updated Player Movement code

الآن عندما تذهب إلى اللعبة، لا ينبغي أن يكون لديك أي مشاكل هجوم أو تحرك، بعد أن تتعرض للهجوم.

قتل اللاعب

والآن بعد أن أصيب اللاعب بأضرار، بدأ بالفعل تجميع اللعبة، ولكن لا يزال أمامنا مشكلة أخرى يجب التعامل معها. إذا كنت تقف أمام الأعداء طويلاً، فسوف تنفد الصحة في نهاية المطاف، وعندما يحدث ذلك، سترى على الأرجح خطأ كهذا:

Error Message show on Player Death

يمكن أن تكون رسائل خطأ فك تشفير جزءًا من فن، لكن هذه الرسالة واضحة تمامًا. يشير هذا الخطأ إلى حدث الخطوة OBJ_Camera، وبالتحديد فإنه يعني أن حدث الخطوة يواجه مشكلة في الوصول إلى كائن OBJ_Player. يحدث هذا لأن كائن اللاعب لم يعد موجودًا. إذا نظرت مرة أخرى إلى حدث خطوة اللاعب، فسترى أن اللاعب يطلب على الفور طلب التدمير () عندما يكون CurrentHP أقل من 0.

Existing Death Code

وهذا يعني أنه في اللحظة التي يموت فيها اللاعب، يتم تدمير كائن اللاعب، ولن تتمكن الكاميرا من متابعته.

لذلك دعونا نضيف بعض التعليمات البرمجية لحل هذا الخطأ ونعطي اللاعب القدرة على إعادة المحاولة عندما يموت.

لإصلاح مشكلة الكاميرا، سنقوم بتعيين حالة الكاميرا إلى "ميت" عندما يموت اللاعب. بهذه الطريقة، لن يتم تشغيل أي من الحالات الأخرى الخاصة بالكاميرا ولن تحاول الكاميرا الوصول إلى أي من متغيرات "اللاعب". يمكننا بسهولة تدمير الكاميرا عندما ندمراللاعب، لكن القيام بذلك يمنعنا من التلاعب بالكاميرا بعد وفاة اللاعب، لذا أجد أنه من الأفضل أن يكون لدينا حالة ميت الحقيقية، في حال أردنا إضافة رسوم متحركة رائعة أو تأثيرات في وقت لاحق.

  1. في OBJ_Player، انتقل إلى حدث الخطوة.
  2. في التعليمة البرمجية الخاصة بحدث الخطوة، استبدل الشيفرة في العبارة else المميزة بالأعلى بالشيفرة التالية:

الآن إذا ذهبت إلى اللعبة وتركت اللاعب يموت، فلا يجب أن يكون لديك أي رسائل خطأ. من ناحية أخرى، أيضاً، عندما يموت اللاعب يختفي على الفور، ويصبح من المستحيل عمل أي شيء، لأن اللاعب لا ينعش أبداً، وليس لدينا شاشة انتهت اللعبة.

لإصلاح هذا، سنمنح اللاعب حركة الموت، وننشئ إنذارًا أساسيًا سيعيد تشغيل اللعبة بعد 3 ثوانٍ من وفاة اللاعب. سيكون هذا أكثر إثارة للاهتمام قليلاً، والسماح للعبة بالاستمرار. في النهاية سنضيف شاشة انتهت اللعبة وحتى نحسن حركة الموت، لكن في الوقت الحالي، يجب أن يكون هذا بديلاً جيدًا.

دعونا أولا نستورد الرمز المتحرك.

اسم الصورة المتحركة صور المنشأ
SPR_PlayerDead

PlayerDead.png

X = 72, Y = 67

الآن سنجري تغييرًا أخيرًا على الحدث الذي يقتل اللاعب.

  1. في OBJ_Player، انتقل إلى الحدث الخطوة.
  2. في شيفرة حدث الخطوة، استبدل رمز طلب التدمير() بما يلي:

آخر شيء يتعين علينا القيام به لهذا هو إنشاء حدث الإنذار الذي سيعيد تشغيل اللعبة.

  1. في OBJ_Player، انتقل إلى إضافة حدث> إنذار> إنذار 1.
  2. أضف التحكم في الإجراء> الشيفرة > تنفيذ الشيفرة.
  3. قم بإضافة التعليمة البرمجية التالية:

الآن عندما تذهب إلى اللعبة وتسمح لنفسك بان تقتل، يجب أن تشاهد مسرحية "الرسوم المتحركة" الخاصة بموت اللاعب، ويجب إعادة تشغيل اللعبة بعد 3 ثوانٍ. إنها ليست مثالية، لكنها بداية جيدة.

The Players Death Animation

الرسوم المتحركة لموت اللاعبين

آخر ما سنفعله هو حل المشكلة التي تم إنشاؤها عن طريق إضافة عبارة التبديل إلى حدث الخطوة للعدو. إذا ذهبت إلى اللعبة وهاجمت العدو، فستلاحظ أنه لن يكون مصدوما عند ضربه. عندما أضفنا عبارة التبديل، قمنا بالكتابة فوق هذه الشيفرة، وقمنا بإزالة هذا التأثير. لحسن الحظ، أيضاً أن حدث الرسوم المتحركة الذي صنعناه قبل بضع دقائق سيجعل من السهل جدًا إضافة هذا الحدث.

بدلاً من ترميز نظام جديد تمامًا، أو تعديل FSM للتعامل مع متغير IsHit الذي أنشأناه في البرنامج التعليمي الأخير، سنقوم بإنشاء حالة جديدة، واستبدال هذا المتغير بتلك الحالة. أول شيء سنقوم به هو إزالة متغير IsHit من الحدث إنشاء، لأننا لن نحتاج إليه بعد الآن.

احذف هذا السطر من التعليمة البرمجية من حدث الانشاء.

بعد ذلك، سنذهب إلى كائن الهجوم وتحريره بحيث يقوم بتعيين الحالة إلى ضرب، بدلاً من جعل مضروب صحيحًا.

  1. انتقل إلى كائن ATK.
  2. افتح حدث الاصطدام OBJ_Enemy.
  3. استبدل السطر من التعليمة البرمجية بتعيين IsHit = true؛ بالسطر التالي من التعليمة البرمجية:

الآن نحن بحاجة إلى إجراء بعض التغييرات الصغيرة على كائن العدو. أولاً  نحتاج إلى تعديل شيفرة التنبيه التي تعيد تعيين حالة العدو، بحيث تعيد تعيين الحالة بدلاً من متغير IsHit.

  1. انتقل إلى كائن العدو.
  2. افتح الحدث انذار 0.
  3. استبدل الرمز بما يلي:

نحتاج أيضًا إلى إضافة حالة "Hit" إلى عبارة التبديل في حدث الرسوم المتحركة.

  1. انتقل إلى كائن العدو.
  2. افتح معرف المستخدم 3.
  3. قم بإضافة حالة جديدة إلى العبارة تبديل مع التعليمة البرمجية التالية:

وأخيرًا، نحتاج إلى إضافة حالة Hit إلى عبارة تبديل حدث الخطوة أيضًا، بحيث يتم تشغيل حدث الرسوم المتحركة عندما يكون العدو في حالة Hit.

  1. انتقل إلى كائن العدو.
  2. افتح حدث الخطوة.
  3. قم بإضافة حالة جديدة إلى العبارة تبديل مع التعليمة البرمجية التالية:

بعد كل ذلك، إذا عدت إلى اللعبة، يجب أن يصاب الأعداء بالصدمة عندما تهاجمهم.

استنتاج

في حين أن قتالنا لا يزال بحاجة إلى الكثير من العمل، حيث أن اللاعب سيحتاج في النهاية إلى حدث خاص به، وسوف يحتاج الأعداء إلى التنقل، فهو بداية جيدة.

في البرنامج التعليمي التالي، سنقوم بمعالجة حركة العدو وهجمات القتال.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.