Corona Game Engine: متى وكيف يتم تطبيق أحداث التصادم

من المحتمل أنك لعبت الكثير من ألعاب الجوال التي طبقت الخصائص والسلوكيات البدنية في جوانب معينة من اللعبة. على سبيل المثال ، القفز من المنصات في Doodle Jump أو هدم أكوام الخشب في Angry Birds.

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

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

لذا ، دعنا نغطس فيه!

لمحة عامة

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

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

يمكن أن يكون هذا الفحص أساسيًا مثل:

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

على سبيل المثال ، يمكنك القول:

كما ترون ، هناك العديد من التعريفات المدرجة هنا: نوع الجسم (الأجسام الديناميكية تتحرك تحت المحاكاة وفقًا لقوى مثل الجاذبية أو قوى الاصطدام الرجعي ، وتقبل تطبيق السرعة ، ولن تستجيب الهيئات الثابتة لقوى مثل الجاذبية وسوف يتصرفون كما لو كان لديهم كتلة لا حصر لها ، تتحرك الأجسام الحركية تحت المحاكاة فقط وفقًا لسرعتها وما إلى ذلك - يمكنك معرفة المزيد عن ذلك على coronalabs.com) والخصائص الفيزيائية التي ستتخذ إجراءات في التفاعلات الفيزيائية المختلفة. على سبيل المثال ، إذا كانت شخصيتنا كرة تصطدم بالأرض ، فسوف يرتد عالياً جدًا لأن الكثير من سرعته ستعود بعد التصادم (الارتداد = 0.8). إذا كانت شخصيتنا رجلاً يتسلق التل ولا نريده أن يميل إلى الخلف ويسقط أثناء تسلقه ، يمكننا تجميد دورانه حول محور محدد إلخ.

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

اصطدامات محددة

كما قلت من قبل ، تتيح لك أحداث التصادم اكتشاف الاصطدام بين الأشياء المادية والتعامل معه. هناك عدة أنواع من التصادمات التي يمكن تحديدها باستخدام Corona:

  • ما قبل التصادم
  • تصادم
  • بعد الاصطدام

هناك أيضًا حالة فرعية لكل حدث تصادم ، حيث يتم تعريفه على أنه:

  • الاصطدام المحلي
  • الاصطدام العالمي

أي واحد تختاره يعتمد على ما تنوي القيام به.

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

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

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

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

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

علاوة على ذلك ، سأنفذ المكتبة الضرورية ، وأبدأ الفيزياء و "أوقف الجاذبية":

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

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

كما ذكرنا من قبل ، يجب تعيين جميع الكائنات التي يجب أن تشارك في التفاعلات المادية ، هيئة الفيزياء:

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

الآن ، دعونا ننشئ وظيفة لتوليد الكائنات الساقطة:

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

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

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

لقد حان الوقت لتحديد حدث التصادم الخاص بنا في شكل دالة:

يجب الانضمام إلى هذا الحدث وربطه بشخصيتنا حتى يكون له أي تأثير:

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

دعونا معاينة النتائج!

لعبة جذابة في العمل

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

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

هذه المرة ، سيكون هؤلاء لاعبين ومجموعة من الأنظمة الأساسية المشفرة:

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

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

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

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

لعبة القفز منصة في العمل

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

الأخير ، وليس آخراً هو حدث ما بعد الاصطدام إنه حدث التصادم الوحيد الذي يتم فيه الإبلاغ عن قوة التصادم والاحتكاك (مرة أخرى ، مزيد من المعلومات على coronalabs.com). ماذا يعني هذا بالنسبة لك كمطور لعبة؟ بناءً على هذه القيم ، على سبيل المثال ، يمكنك تحديد قوة وكمية أحداث معينة.

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

على سبيل المثال ، سوف أقوم بإنشاء كرة تضرب دائرة شخصياتنا.

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

يمكن تعريف حدث ما بعد الاصطدام مثل هذا:

والنتيجة النهائية تبدو كالتالي:

لعبة ما بعد الاصطدام في العمل

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

استنتاج

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

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

__________
نحن متاحون للشراكات ونفتح لمشاريع جديدة. إذا كانت لديك فكرة ترغب في مناقشتها ، شاركها مع فريقنا!