مساحة اعلانية

آخر المواضيع

انشاء لعبة الدودة باستخدام برنامج cocos 2d :الجزء الثانى من انشاء الدودة


هذا الدرس الرابع من دورة انشاء لعبة الدودة لاجهزة ios سنكتب الاكواد الاساسية لجسم الدودة, لنبدأ الان .
أين توقفنا ...


هذا هو الدرس الرابع من دورة الcocos 2d تاكد من قراءة الاجزاء السابقة قبل البدافى الدرس السابق شرحت لك طريقة انشاء الدودة وجسمها المكون من القطع وشرحت كيفية تحريك الراس ويتبعها كل القطع بعدهااليوم سنتناقش حول كل ما يتعلق بالدودة ساريك كيف تتفاعل الدودة مع البيئة المحيطة مثل الحوائط و البراعم
الانتهاء من هذا الدرس الدودة ستكون قادرة على التفاعل و التحرك فى البيئة المحيطة وهذا ما ناقشنه فى الجزء الثانى.
الخطوة الاولى : حذف اكواد الاختبارات
فى الدرس السابق وضعنا بعد الاكواد البسيطة لتحريك الدودة للامام

 كان هذا مؤقت ولم نعد بحاجة اليه افتح ملف caterpiller.mوامسح الاكواد التالة من دالة update:

x += kGridCellSize;
وسنقوم بتعديل المتغيرات x , y قريبا

الخطوة الثانية : دالة الاصطدام
سيتم تنفيذ مجموعة من الاكواد عند كل مرة يحدث تصادم

عندما يحدث تصادم فى كل مرة راس الدودة تعترضها مثلا الحائط الايمن او الحائط الايسر او الحائط الاعلى او الحائط السفلى او البراعم  والهدف من ذلك هو تحديث الحالة الجديدة للدودة وفقا لذلك, قبل ان اريك دالة الصطدام لنناقش القواعد الاساسية للدودة فى اللعبة الاصلية.
1- تستمر الدودة فى اتجاهها الحالى حتى تظهر امامها عقبة.2- عندما تتحرك الدودة لاسفل  وحدث تصادم مع حائط او برعم فحركاتها المقبلة ستكون خطوة للاسفل و مسافة اخرى فى الاتجاه المخالف.3- واذا كانت الدودة تتحرك للامام وتصادمت مع حائط او برعم ستتحرك خطوة للامام و مسافة فى الاتجاه المعاكس.4- اذا حدث تصادم بين الجزء السفلى سيتحول اتجاهها كليا للاعلى.5- اذا تصادمت الدودة مع الصف العلوى سيتغير اتجاهها للاسفل
مع هذه القواعد سنبدا انشاء دالة collision: افتح ملف caterpiller.m واضف الكود التالى 
@interface Caterpillar(Private)
- (void) collision;
@end
والتنفيذ
- (void) collision {
// 1
BOOL down = self.currentState == CSDownLeft ||
self.currentState == CSDownRight ||
self.previousState == CSDownLeft ||
self.previousState == CSDownRight;
// 2
self.previousState = self.currentState; // 3
if(down) {
if(self.currentState == CSRight) {
self.currentState = CSDownLeft;
} else {
self.currentState = CSDownRight;
}
} else {
if(self.currentState == CSRight) {
self.currentState = CSUpLeft;
} else {
self.currentState = CSUpRight;
}
}
}

1- الخطوة الاولى هى تحديد الاتجاه الذى تتحرك فيه الدودة اسفل ام اعلى يمكننا تحديد ذلك عن طريق معرفة الحالة السابقة او الحالية .
2- الخطوة التالية هى تعديل الحالة السابقة الى الحالة التالية سيكون هذا مفيد عند نبدا بتحريك الدودة حسب حالتها
3- اخييرا نحن نحدد ما إذا كان ينبغي لنا أن نكون في حالة لأعلى يسار / يمين أوحالة لاسفل يسار/يمين وتعديلها

الان نحن نستطيع تحديد حالة الدودة عند حدوث اصطدام واكتشاف التصادم الفعلى ونقل الدودة

الخطوة الثالثة : حركة الدودة والاصطدام بالحوائط
منذ ان انشانا الدودة كالة كبيرة وهذا الجزء سينهى هذه المشكلة الكبيرة
حالات هذه المشكلة هى كل حالات الممكنة للدودة فى الكود فى الاسفل سنبدا باكثر حالتين وهى CSRight و CSLeft اضف الكود التالى لدالة update: داخل ملف Caterpillar.m . تاكد من اضافة الاكود قبل سطر self.position = ccp(x,y);. .

.switch (self.currentState) { case CSRight: // 1 if(x + kGridCellSize >= kGameAreaStartX + kGameAreaWidth) { // 2 if(y - kGridCellSize <= kGameAreaStartY) { self.previousState = CSUpLeft; self.currentState = CSRight; } else if(y >= kGameAreaStartY + kGameAreaHeight - kGridCellSize) { // 3 self.previousState = CSDownRight; self.currentState = CSRight; } else { // 4 if(self.previousState == CSDownRight || self.previousState == CSDownLeft) { self.currentState = CSDownLeft; } else { self.currentState = CSUpLeft; } self.previousState = CSRight; [self update:4.0]; return; } // 5 [self collision]; } else { // 6 x = x + kGridCellSize; } break; case CSLeft: // Check for a wall collision if(x <= kGameAreaStartX) { if(y - kGridCellSize <= kGameAreaStartY) { self.previousState = CSUpRight; self.currentState = CSLeft; } else if(y >= kGameAreaStartY + kGameAreaHeight) { // Top collision self.previousState = CSDownLeft; self.currentState = CSLeft; } else { // Left wall collision if(self.previousState == CSDownRight || self.previousState == CSDownLeft) { self.currentState = CSDownRight; } else { self.currentState = CSUpRight; } self.previousState = CSLeft; [self update:4.0]; return; } [self collision]; } else { x = x - kGridCellSize; } break; }
بما ان الحالتين متشايهتين ساشرح حالة واحدة فقط وهى الحالة اليمنى
1- هذا لتاكد من ان الدودة اصطدمت بالحافة اليمنى, اذا كان كذلك يجب ان نحدد مكانها لنقرر ماذا نفعل بعدها.2- التاكيد الاول لتقرير اذا كانت الودة فى الاسفل فى الشاشة اذا كان كذلك فاننا ببساطة ننقلها الى الاتجاه المخالف لتعديل المكان السابق وجعل الاتجاه لاعلى لارسال دودة اخرى.3- وهذا هو عكس الجملة السابقة اذا كانت الدودة اعلى الشاشة.4- وهذه هى الحالة الاساسية لهذه المشكلة, فهي تنتج عند الاصطدام بالجدارالجانبي وهي ليست في أعلى ولا أسفل, اذا كانت كذلك فاننا نعدل الحالة السابقة ونستدعى هذه الدالة مجددا, السبب فى استدعاء الدالة مرة اخرى اننا لانريد ان تستمر الدودة فى الحركة فى  نفس الاتجاه.5- استدعاء دالة الصطدام من اجل تعديل ااموقعين السابق والتالى.6- اخيرا اذ لم يكن هناك تصادم تتحرك الدودة للامام.إذا قمت بتشغيل اللعبة فى هذا الوقت فان الدودة ستتحرك للامام حتى تصطدم بالحائط الايمنا
بعد ذلك ستوقف وبقية الجسم سيتبعها الان لننفذ الحالات المتبقية من اجل الاستجابة للحالات الاخرى
// ... case CSDownLeft: // 1 if(self.moveCount == 0) { y = y - kGridCellSize; self.moveCount++; } else { // 2 x = x - kGridCellSize; self.moveCount = 0; self.currentState = CSLeft; self.previousState = CSDownLeft; } break; case CSDownRight: if(self.moveCount == 0) { y = y - kGridCellSize; self.moveCount++; } else { x = x + kGridCellSize; self.moveCount = 0; self.currentState = CSRight; self.previousState = CSDownRight; } break; case CSUpRight: if(self.moveCount == 0) { y = y + kGridCellSize; self.moveCount++; } else { x = x + kGridCellSize; self.moveCount = 0; self.currentState = CSRight; self.previousState = CSUpRight; } break; case CSUpLeft: if(self.moveCount == 0) { y = y + kGridCellSize; self.moveCount++; } else { x = x - kGridCellSize; self.moveCount = 0; self.currentState = CSLeft; self.previousState = CSUpLeft; } break; default: break;
كما فعلنا فى المرة السابقة سنشرح قضية واحدة فقط لانها جميعا متشابهة.1- كل الحالات تتطلب خطوتين حتى تعمل اول خطوة هى الاتجاه لاسفل والخطوة الثانية هى تغيير الاتجاه وبالتالى فان الخاصية  ستكون اما 0 او 1 , القيمة 0 ستجعل الدودة تتحرك لاسفل بينما القيمة 1 ستجعلها تتحرك للامام.2- فى هذه المرحلة سنعيد تعيين اما من اليسار او اليمين ومن ثم نعيد تعيين خاصية movecount . Basically, continuing as usual.الان قم بتشغيل اللعبة, الان يجب ان تتحرك الدودة وتجتاز مستوى وتتحرك للامام وللخلف كما انها ان تتفاعل مع البراعم فى هذه المرحلة
الخطوة الرابعة : التصادم مع البراعم
اذا اتبعت الخطوات السابقة بان التصادم مع الراعم بسيط للغاية المشكلة فى التاكد من ان حدود الراس امام حدود البراعم على الشاشة افتح ملف Caterpillar.m واضف الكود التالى
// 1 CGRect caterpillarBounds = [self getBounds]; // 2 [self.gameLayer.sprouts enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { Sprout *sprout = (Sprout *)obj; CGRect sproutBounds = [sprout getBounds]; // 3 if(self.currentState == CSRight) { CGRect rightBounds = caterpillarBounds; rightBounds.origin.x = rightBounds.origin.x + kGridCellSize; if(CGRectIntersectsRect(rightBounds, sproutBounds)) { [self collision]; *stop = YES; } } // 4 if(self.currentState == CSLeft) { CGRect leftBounds = caterpillarBounds; leftBounds.origin.x = leftBounds.origin.x - kGridCellSize; if(CGRectIntersectsRect(leftBounds, sproutBounds)) { [self collision]; *stop = YES; } } }];
1.نحتاج الحصول على حدود الدودة فى هذه الحالة هى حدود الراس
2. فى كل استدعاء للدالة update: يتم عد كل البراعم للتاكد من عدم حدوث اصطدام
3.اختبار للتاكد من ان الدودة لم تصطدم بالبراعم من اليمين
4.اختبار للتاكد من ان البراعم لم تصطدم بالبراعم من اليسار
اذا حدث تصادم فانه يتم استدعاء دالة التصادم لتحديث الحالة
وتعديل النتغير *stop لايقاف العد.
الان عند تشغيل اللعبة يجب ان تتحرك الدودة وتتفاعل مع البراعم
من اعلى الى اسفل

خاتمة
 تعلمنا طريقة برمجة اللعبة فى الدرس القادم سنتعلم

كيف سيتعامل اللاعب مع اللعبة.









الكــاتــب

    • مشاركة

ليست هناك تعليقات:

جميع الحقوق محفوظة لــ الشبح للمعلوميات 2019 ©