Advertisement
  1. Code
  2. iOS SDK

بناء لعبة كاتربيلر بإستخدام Cocos2D: الحركة والقذائف

Scroll to top
Read Time: 6 min
This post is part of a series called Building a Caterpillar Game with Cocos2D.
Build a Caterpillar Game with Cocos2D: Caterpillar AI
Build a Caterpillar Game with Cocos2D: Collision Detection

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

هذه هي الحلقة الخامسة من سلسلة دروس الـ Cocos2D لإستنساخ لعبة Centipede إلى iOS (أي-او-إس). قبل أن تبدء في هذا الدرس تأكد من أن تكمل الأجزاء السابقة.


في الحلقة السابقة...

فى الحلقة السابقة تناقشنا عن موضوع الذكاء الإصطناعي (AI) لي الـ caterpillar. وتعلمنا كيف نحرك caterpillar خلال حقل الانبات وحدود المستوى

في درس اليوم سنتطرق الى الكثير من المواضيع خلال نقاشنا لحركة\تفاعل اللاعب واطلاق الصواريخ.


الخطوة الاولى: التحكم باللاعب

التحكم باللاعب أمرٌ بسيط وسهل الى حد ما. أول شيء يتعين علينا القيام به هو أن نخبر الطبقة الخاصة بلعبتنا بأن تستجيب للَّمسات من أجل التفاعل معها. قم باضافة الكود التالي الى دالة init الموجودة في GameLayer.m:

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

  1. اولا يجب ان نصمم الدالة ccTouchesBegan لكي تسمح لمن استدعاها بأن يعلم بأننا نستجيب للَّمسات. اذا تجاهلت هذه الخطوة، فإن لعبتك ستنهار.
  2. بعد ذلك، لدينا الدالة ccTouchesMoved والتي يتم استدعائها عندما يقوم اللاعب بسحب اصبعه على الشاشة.
  3. احصل على مرجع للإحداثيات الخاصة بموقع اللمسة الحالية وللاإحداثيات الخاصة بموقع اللمسة السابقة.
  4. احصل على التغُّير بين الموقع القديم والموقع الجديد. سنستخدم هذا التغير لتحديد كم يجب على اللاعب أن يتحرك.
  5. هنا لدينا سلسلة من الاختبارات للتحقق من بقاء اللاعب داخل "منطقة اللاعب" او المربع الحدودي الوهمي الذي وضعناه لهم. و الكود السابع فى الواقع هو الذى يحرك اللاعب
  6. تحديث مكان اللاعب
  7. نقوم هنا بالتحقق لنرى اذا ما اصطدم اللاعب بأي من ال sprouts. تشكل ال sprouts عقبات بالنسبة للاعب ونحن نريد ان نقيد حركة اللاعب في حال كانوا في طريقه.
  8. اخيراَ، اذا كان هنالك تصادم، فإننا سنعيد موقع اللاعب الى الموقع الجيد الاخير.

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


الخطوة الثانية: الكائن الصاروخى

كائن الصاروخ هو الذي يسمح لللاعب ولبقية اجسام اللعبة بالتفاعل. اللاعب سيطلق سيلاً مستمراً من الصواريخ بسرعة وتواتر متفاوتين بحسب المستوى الحالي.

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

سأقوم بشرح كلٍ منها حالما نصل الى الكود الذي يليها. الآن، انشئ فئة فرعية subclass جديدة ل GameObject وسمها Missile. اضف الكود التالي الى Missile.h:

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

الآن، افتح Missile.m واضف الكود التالي:

  1. دالة الـ init الخاصة بنا تبدو مألوفة للغاية وهي مسؤولة فقط عن انشاء الـ sprite الخاصة بالصاروخ.
  2. هذه هي السرعة التي سيتحرك فيها الصاروخ. وهويبدا بالقيمة الاساسية ويُسرع استنادا الى المستوى الحالى
  3. عند مرحلة ما، قد تخرج سرعة الصاروخ عن السيطرة. منعنا ذلك من خلال اضافة سرعة قصوى.
  4. هذان السطران هما في الواقع من يحركان الصاروخ الى الامام. نقوم بحساب قيمة y جديدة للصاروخ ومن ثم نحدث الموقع.
  5. اخيرا اذا اصطدم الصاروخ بالجزء العلوى نحول خاصية _dirty  الى true سنقوم بعمل جمع للقمامة garbage collect للصواريخ ذات القيمة dirty داخل الـ GameLayer.

الخطوة الثالثة: اطلاق الصواريخ

الآن وبعد ما اصبح لدينا بعض الصواريخ لنطلقها، علينا ان نقوم باطلاقهم من اللاعب. بشكل عام، عندما يكون لديك عدد ضخم من الاجسام مثل الصواريخ، يفضل اعادة استخدام اكبر عدد ممكن منه وان لا تعيد حجز نسخ جديدة منها في الذاكرة اثناء تشغيل حلقة اللعبة الرئيسية. لحل هذه القضية سننشئ مصفوفتين: المصفوفة الاولى ستحتوي على كل الصواريخ الموجودة حاليا في اللعبة ( يعني التي اطلقت من قبل اللاعب) والمصفوفة الاخرى ستحتوي على مجموعة الصواريخ التي لم تطلق بعد. فى نهاية طريقة التحديث سننظف كل خاصية dirty من الصواريخ وننقلهم من مصفوفة  "in play" داخل اللعب الى المصفوفة الاخرى "pool"

اضف الخصائص التالية إلى ملف GameLayer.h:

الان افتح GameLayer.m وقم باستيراد ملف Missile.h واضف السطور التالية الى طريقة init الخاصة بك

  1. تهيئة كلا من المصفوفتين
  2. كرر عملية إنشاء الصواريخ بعدد الـ kMissilesTotal مرة. مرة واحدة يتم انشاؤهم ونضيفهم الى مصفوفة 

بعد ذلك سننتقل الى دالة التحديث لنضيف الكود التالى:

  1. نحتاج الى انشاء عداد ثابت للمساعدة فى تسهيل التردد الذى ينطلق منه الصواريخ
  2. حساب تردد اطلاق الصواريخ كما يزداد المستوى يزداد التردد ايضا
  3. نحن نحتاج فقط الى اطلاق صاروخ جديد اذا كان التردد اكبر من او مساويا للتردد المحدد لكل مستوى
  4. سحب الصاروخ من مصفوفة الانتظار (اذا كان بها) واضافتها لمصفوفة الاطلاق فى هذه المرحلة ايضا اضفنا روح الصاروخ لعقدة الدفع التى يمكن استخلاصها
  5. التحقق من تعداد كافة الصواريخ من وجود واحد فذر اذا وجدنا واحد تذكر اى واحد يمكننا تحريكه مجددا الى مصفوفة الانتظار
  6. اذا كان هنالك صاروخ يحقق الخاصية dirty، فانقله من مصفوفة الانتظار الى مصفوفة الاطلاق واحذف ال sprite الخاصة به من الـ batch node.

هذا هو كامل الكود المطلوب لتحريك الصواريخ. تقدم للامام وقم بتشغيل اللعبة عند هذه النقطة شاهد الصواريخ منطلقة من اللاعب وانت تتحرك حولها صورة

MissilesMissilesMissiles


خاتمة

الان نحن سمحنا للاعب وبعض الصواريخ بالتحرك الان بدات تشعر انها حقا لعبة  كما اننا كشفنا بعض التصادم بين اللاعب و البراعم فى الجزء القادم من السلسلة سندخل اعمق فى كشف الاصطدام بين الصواريخ والبراعم والحشرة  وبين اللاعب والحشرة

استمتعوا بالبرمجة

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.