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

آخر المواضيع

لعبة البناء "كاتربيلر" بـ: Cocos2D الخطوات النهائية

لعبة البناء "كاتربيلر" بـ: Cocos2D الخطوات النهائية
لعبة البناء "كاتربيلر" بـ: Cocos2D الخطوات النهائية

هذه هي الدفعة السابعة والأخيرة لدينا من سلسلة دروس Cocos2D عن استنساخ ممتاز لدائرة الرقابة الداخلية. تأكد من أنك قد أكملت الأجزاء السابقة فى المرة الأخيرة قبل البداية.

في البرنامج التعليمي الماضي، ناقشنا كيفية القيام بتصادم بسيط بين كافة الأهداف في لعبتنا.

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




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

قم بفتح  GameLayer.m ثم أضف الأسلوب التالي:


(void)checkNextLevel {   if([self.caterpillars count] == 0) { //1         self.level++; // 2         // 3        CGPoint startingPosition = ccp(kGameAreaStartX, kGameAreaHeight + kGameAreaStartY - kGridCellSize / 2);        Caterpillar *caterpillar = [[[Caterpillar alloc] initWithGameLayer:self level:self.level position:startingPosition] autorelease];        [self.caterpillars addObject:caterpillar];         // 4        int minSproutCount = kStartingSproutsCount + self.level * 2;                           if([self.sprouts count] < minSproutCount) {            int numberOfSproutsToPlace = minSproutCount - [self.sprouts count];            for(int x = 0; x < numberOfSproutsToPlace; x++) {                [self placeRandomSprout];            }                   }     }}

(١) تحقق لمعرفة ما إذا كان هناك أي كاتربيلر على اليسار.
(2) مستوى إضافى.
(3) خلق كاتربيلر جديدة وإضافتها للعبة (إستناداً إلى مستوى جديد) .
(٤) إضافة براعم لتتناسب مع minSproutCount

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

 بداخل طريقة splitCaterpillar:atSegment
 أضف السطر التالي قبل العبارة العكسية داخل أول if statement

if([caterpillar.segments count] == 1) {
    // ...
    // Add this line
    [self checkNextLevel];
    return;
}

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

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


الخطوة 2: تسجيل النقاط :

داخل اللعبة، وهنا كالعديد من الأماكن التى يستطيع فيها اللاعب زيادة درجاته ونقاط تسجيله. هم:

ضرب برعم
ضرب كاتربيلر
التقدم إلى المستوى التالي

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


#define kSproutHitPoints 25#define kCaterpillarHitPoints 200#define kNextLevelPoints 1000


دعونا نبدأ بإضافة مجموعة نقاط اللاعب حينما يقوم بإصابة برعم جديد لتصبح النتيجة لاعب عندما ضرب تنبت في اللعبة. قم بفتح Missile.m ، Player.h ، ثم قم بإضافة الكود التالي داخل حلقة التحقق من التصادم مع برعم جديد:

سوف نرى كيف تستخدم هذه كلما تقدمنا قليلاً إلى مزيد من هذا البرنامج التعليمي.


self.gameLayer.player.score += kSproutHitPoints +            (arc4random() % self.gameLayer.level) *            (arc4random() % self.gameLayer.level);[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationPlayerScore object:nil];


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

وفى المرحلة القادمة نحن بصدد إضافة النقاط عندما يتم إصابة كاتربيلر. في الجزء السفلي من update ، في Missile.m قم بإضافة الكود التالى قبل تقسيم كاتربيلر:


if(hitCaterpillar && hitSegment) {      // Add these lines    self.gameLayer.player.score += kCaterpillarHitPoints +    (arc4random() % self.gameLayer.level) *    (arc4random() % self.gameLayer.level);    [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationPlayerScore object:nil];     // ... code to split the caterpillar ...}


هذا الكود لا يختلف كثيراً عما رأيت أعلاه. المرحلة النهائية لإضافة النقاط هو عندما يتقدم لاعب في المستوى. سيتم وضع هذا الكود داخل طريقة checkNextLevel التي كتبتها أعلاه قم بفتح GameLayer.m ثم انتقل إلى طريقة checkNextLevel ثم أضف الكود التالي فقط بعد if statement:

self.player.score += kNextLevelPoints * self.level; [[NSNotificationCenter defaultCenter] postNotificationName:kNotificationPlayerScore object:nil];

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

الخطوة 3: إنتهاء اللعبة:

إعتباراً من الآن، يمكن للاعب أن يملك حياة لا نهائية وأيضاً Game Genie نحن بحاجة إلى تغيير ذلك. أولاً، إنشاء ملف جديد يسمى GameOverLayer.m بإمتداد CCLayer.

بإضافة الكود التالي إلى GameOverLayer.h:



#import "cocos2d.h"#import "GameConfig.h" @interface GameOverLayer : CCLayer@property (nonatomic, assign) NSInteger score;@property(nonatomic, retain) CCLabelTTF *scoreLabel;@property(nonatomic, retain) CCLabelTTF *highScoreLabel;+(CCScene *) sceneWithScore:(NSInteger) score;@end


سأقوم بتوضيح ألية عمل الطرق والخصائص والأساليب خلال التنفيذ
الآن قم بإضافة الكود التالي إلى GameOverLayer.m:


#import "GameOverLayer.h"#import "GameLayer.h" #import "SimpleAudioEngine.h" @implementation GameOverLayer @synthesize score = _score;@synthesize scoreLabel = _scoreLabel;@synthesize highScoreLabel = _highScoreLabel; // 1+(CCScene *) sceneWithScore:(NSInteger) score{    // 'scene' is an autorelease object.    CCScene *scene = [CCScene node];     // 'layer' is an autorelease object.    GameOverLayer *layer = [GameOverLayer node];    layer.score = score;     // add layer as a child to scene    [scene addChild: layer];     // return the scene    return scene;} // 2- (void)dealloc {    [_scoreLabel release];    [_highScoreLabel release];    [super dealloc];} -(id) init{    if( (self=[super init])) {                     // 3[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565];        CCSprite * background = [CCSprite spriteWithFile:@"game-over.png"];background.anchorPoint = ccp(0,0);[self addChild:background];   // 4scoreLabel = [[CCLabelTTF labelWithString:@"0"  dimensions:CGSizeMake(320, 30)  alignment:UITextAlignmentCenter   fontName:@"Helvetica"  fontSize:30] retain];_scoreLabel.anchorPoint = ccp(0,0); scoreLabel.position = ccp(0,155); [self addChild:_scoreLabel];                 _highScoreLabel = [[CCLabelTTF labelWithString:[NSString stringWithFormat:@"High: %d",0]  dimensions:CGSizeMake(320, 35)alignment:UITextAlignmentCenterfontName:@"Helvetica"  fontSize:30] retain]; _highScoreLabel.anchorPoint = ccp(0,0); _highScoreLabel.color = (ccColor3B){255,0,0};  _highScoreLabel.position = ccp(0,195);        [self addChild:_highScoreLabel];         // 5[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; [[SimpleAudioEngine sharedEngine] playEffect:@"game-over.caf"];     }    return self;} - (void)setScore:(NSInteger)score {    _score = score;    self.scoreLabel.string = [NSString stringWithFormat:@"Score: %d",_score];     // 6    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];    NSInteger highScore = [defaults integerForKey:@"CentipedeHighScore"];     // 7    if(score > highScore) {        highScore = score;        [defaults setInteger:score forKey:@"CentipedeHighScore"];        [defaults synchronize];    } self.highScoreLabel.string = [NSString stringWithFormat:@"High: %d",highScore];} // 8(BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {[[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:.5 scene:[GameLayer scene] withColor:ccWHITE]];    return YES;}  @end


(١)هذا هو الأسلوب القياسي لدينا لإقامة مشهد جديد. والفرق الوحيد هو، أنه يأخذ NSInteger ويتم ضبطه وفقاً إلى النتيجة الحالية.
(2) تنظيف
(3) ضبط الخلفية
(4) إعداد بطاقات لعرض النتيجة، والدرجات العالية
(5) تمكين اللمسات
(6) ابحث عن الدرجات العالية
(7) قارن درجتك الجديدة بالدرجات العليا، وأحفظ النتيجة الجديدة إذا كانت أعلى.
(8) ابدأ لعبة جديدة إذا لمس اللاعب الشاشة.

وهنا لقطة من الشاشة التى يجب أن تظهر لك:



لعبة البناء "كاتربيلر" بـ: Cocos2D الخطوات النهائية
لعبة البناء "كاتربيلر" بـ: Cocos2D الخطوات النهائية

والخطوة الأخيرة هى أن تقوم بفتح GameLayer.m ثم أضف السطور التالية في نهاية طريقة updateLives


if (lifeCount == 0) { [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:.5 scene:[GameOverLayer sceneWithScore:self.player.score] withColor:ccWHITE]]; }

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

الخطوة النهائية في بناء لعبتنا هى إضافة الصوت. 
أولاً، قم بتحميل الأصوات أدناه وإضافتها إلى المشروع:
GameSounds.zip

كالعادة فإن التعامل مع الصوت هو بمثابة عقبة في لعبة OpenGL وسوف يجب عليك استخدام شيء أخر مثل OpenAL أو مكتبة أخرى معقدة من الـ: C++ library أوCocos2D لديه أشياء مبسطة فى SimpleAudioEngine library
 الخاصة به. فهو يوفر لك القدرة على اللعب بسهولة مع سماع الموسيقى الخلفية بنفس جودة الأصوات وسرعتها.

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


قم بفتح AppDelegate.m ، SimpleAudioEngine.h وإضافة السطر التالي إلى الجزء السفلي من طريقة applicationDidFinishLaunching



[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"background.caf"];i

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

في Caterpillar.m، عندما يصطدم كاتربيلر مع لاعب أي نهاية طريقة update:

[[SimpleAudioEngine sharedEngine] playEffect:@"player-hit.caf"];

وفى Missile.m حينما تصتدم القذيقة مع البرعم:

[[SimpleAudioEngine sharedEngine] playEffect:@"sprout-hit.caf"]; 

أيضا فى Missile.m حينما تصتدم القذيفة مع كاتيربيلر:


[[SimpleAudioEngine sharedEngine] playEffect:@"caterpillar-hit.caf"];

وفي الطريقه المبدأية في GameOverLayer.m:



[[SimpleAudioEngine sharedEngine] playEffect:@"game-over.caf"];


ويجب أن يغطي هذا جميع الأصوات التى استخدمتها فى تلك اللعبة وأيضاً تأكد أنك قد أدخلت SimpleAudioEngine.h فى كل من الفئات المذكورة أعلاه.


الخلاصة:

وهذه تضم اختتام سبع دروس تفي بطريقة إنشاء لعبة "كاتيربيلر" باستخدام Cocos2D للآيفون.


الآن، يجب أن يكون لديك فهم عميق لكيفية تصميم وبناء لعبة بسيطة باستخدام محرك اللعبة Cocos2D إذا كان لديك أي أسئلة أو تعليقات، لا تتردد في تركها في قسم التعليقات هنا أو اكتبها لي على write them to me on Twitter 

إلى اللقاء أخوتى وأخواتى!

الكــاتــب

    • مشاركة

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

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