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

آخر المواضيع

إنجازات وتطورات مركز اللعبة iOS SDK: - الجزء الثانى.



أهلا بكم في الجزء الثانى و الأخير من سلسلة برنامج (Game Center) التعليمى .
سوف ندمج الـ(achievements و leaderboards) الذين أنشأناهم بواسطة ال (iTunesConnect) فى الجزء الأول عن طريق (Objective-C و Xcode ).


الخطوة الأولى : بناء الـ( Interface)

قبل الشروع فى بناء الـ(Interface) سوف نحتاج إلى تثبيت بعض الـ(outlets و actions).
  
الآن نفتح (Game_CenterViewController.h) و نقوم بتعديل الأكواد لتكون كالتالى :
#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>
#import "GameCenterManager.h"
@class GameCenterManager;
@interface Game_CenterViewController : UIViewController <UIActionSheetDelegate, GKLeaderboardViewControllerDelegate, GKAchievementViewControllerDelegate, GameCenterManagerDelegate> {   
    GameCenterManager *gameCenterManager; 
    int64_t  currentScore;  
    NSString* currentLeaderBoard;   
    IBOutlet UILabel *currentScoreLabel;
}
@property (nonatomic, retain) GameCenterManager *gameCenterManager;
@property (nonatomic, assign) int64_t currentScore;
@property (nonatomic, retain) NSString* currentLeaderBoard;
@property (nonatomic, retain) UILabel *currentScoreLabel;
- (IBAction) reset;
- (IBAction) showLeaderboard;
- (IBAction) showAchievements;
- (IBAction) submitScore;
- (IBAction) increaseScore;
- (void) checkAchievements;
@end

أولا : سوف نستورد إطار (GameKit) و الـ(GameCenterManager class) ثم نجعل الـ (GameCenterManager class) معرفة؛ لنتمكن من تعريف أى شىء ضمن هذا الـ (class) فى الـ (Interface) بعد ذلك تصبح الـ (Delegates) الآتية معرفة.

* UIActionSheetDelegate: لاستخدام ورقة عمل.

* GKLeaderboardViewControllerDelegate: لعرض الـ(Leaderboard) فى تطبيقنا.

* GKAchievementViewControllerDelegate: لعرض الـ (achievements) فى تطبيقنا.

* GameCenterManagerDelegate: لاستخدام الـ (GameCenterManagerDelegate )

فى الـ(interface@) نقوم بتعريف بعض الحالات ثم نقوم بإنشاء بعضا من الـ(actions), ثم نضغط (CMD + S) لحفظ المشروع.

فى ملف الـ(Game Center) الذى يوجد بداخل (Project Navigator) نضغط على (Game_centerViewController.xib)

اختر الـ(View window) ثم اختر الخلفية المفضلة، لقد اخترت أنا (Scroll View Textured Background Color).

ثم اسحب 5 من(Round Rect Buttons) من الـ(Library) إالى الـ(view).

ثم أعد تسميتهم و ترتيبهم كالصور أدناه . و اسحب أيضا 2 (Labels) من الـ(Library) إالى الـ(view).

أعد تسمية الـ( label) الأول إالى (:Current Score) و احذف النص المكتوب فى الـ( label) الثانى.

















اضغط على (File’s owner) ثم قم بفتح ( Connections Inspector)

















قم بتوصيل الـ(actions) بالأزرار المرتبطة عن طريق سحبهم إالى الأزرار و من ثم نضغط (Touch Up Inside) من القائمة.
.


الآن نسجب مخرج الـ(CurrentScoreLabel) بدون أى نص، ونكون بذلك قد انتهينا من الـ(interface)

الخطوة الثانية : تعديل الـ (AppSpecificValues.h).
قم بفتح الـ(AppSpecificValues.h) و قم بتعديل الأكواد ليتم قرائتها كالآتى:

//Leaderboard Category IDs#define kLeaderboardID @"1" //Achievement IDs#define kAchievementOneTap @"1_Tap"#define kAchievement20Taps @"20_Taps"
هنا نقوم بإنشاء الثوابت للـ(leaderboard و achievements)، وكما نرى فالـ(ID’s) هنا كالذين أنشأناهم من قبل فى (iTunes Connect).

الخطوة الثالثة : تعديل(Game_CenterViewController.m) 

أولاً، سوف نقوم بتجميع الحالات ثم نطلقهم، أيضا سنستورد الـ(AppSpecificValues)والـ(GameCenterManager classes).

فقم بفتح الـ(Game_CenterViewController.m) و قم بتعديل الكود الذى يوجد في اعلى الصفحة كالآتى:


#import "Game_CenterViewController.h"
#import "AppSpecificValues.h"
#import "GameCenterManager.h"

@implementation Game_CenterViewController

@synthesize gameCenterManager;
@synthesize currentScore;
@synthesize currentLeaderBoard;
@synthesize currentScoreLabel;

الآن قم بتعديل وظائف الـ(viewDidUnload)والـ(dealloc) كالآتى:

- (void)viewDidUnload{    [super viewDidUnload];    // Release any retained subviews of the main view.    // e.g. self.myOutlet = nil;         self.gameCenterManager = nil;    self.currentLeaderBoard = nil;    self.currentScoreLabel = nil;}  - (void)dealloc {    [gameCenterManager release];    [currentLeaderBoard release];    [currentScoreLabel release];    [super dealloc];}

الخطوة الرابعة: تسجيل الدخول فى الـ(Game Center)
انتقل للأسفل إلى وظيفه (viewDidLoa) و قم بإبطالها وقم بتعديل الكود ليصبح كالآتى:-

- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.currentLeaderBoard = kLeaderboardID;
    self.currentScore = 0;
 
    if ([GameCenterManager isGameCenterAvailable]) {
     
        self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease];
        [self.gameCenterManager setDelegate:self];
        [self.gameCenterManager authenticateLocalUser];
     
     
    } else {
     
        // The current device does not support Game Center.
             
    }

}

أولاً نقوم بتثبيت الـ(currentLeaderboard) إلى الـ(leaderBoard) التى قمنا بإنشائها فى الـ(iTunesConnect)، بعد ذالك نقوم بتثبيت النقاط الحاليه الخاصة بنا الى 0. وأعلى النقاط الخاصة بنا فى الـ(Game Center ) لن تكون 0، لأنه لا يحتسب (Score) إلا إذا كان أكثر من الذى قبله، نفحص الآن الـ(Game Center) لنرى إن كان متاحا أم لا، فإن كان متاحاً نقوم بالتواصل مع المستخدم، أما إذا كان غير متاح فلا يحدث شىء ويمكن إرسال إنذار له بهذا الخبر.

الآن يمكنك تجربة المشروع، اضغط (CMD + R) لبنائه و تشغيله، سوف تحصل على بعض الإنذارات، لكن التطبيق سوف يعمل، إذا كنت مسجل حالياً لدى ( Game Center ) سوف تحصل على الرسالة الآتية :("Welcome Back, "Game Center Name) أما إن لم تكن من المسجلين الحالين لدى (Game Center) سوف تحصل على إنذار مع إختيار لعمل حساب جديد، قم بتسجيل الدخول بحساب موجود حالياً أو قم بالإلغاء، إذا قمت بالإلغاء فلن تعمل الـ(leaderboard) و الـ(achievements)، لأنك لم تقم بتسجيل الدخول فى الـ(Game Center)، و لن تعمل الأزرار؛ لأننا لم نقم بتحديد أفعالها فى الـ(Xcode).
















الخطوة الخامسة : إظهار الـ(Leaderboards) و الـ (Achievements 

إذا كنت تستخدم برنامج المحاكاة (simulator) فأغلقه و اذهب إلى الـ( Xcode) وأضف الأكواد الآتية تحت وظيفة الـ(viewDidLoad)
- (IBAction) showLeaderboard{ GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init]; if (leaderboardController != NULL) { leaderboardController.category = self.currentLeaderBoard; leaderboardController.timeScope = GKLeaderboardTimeScopeWeek; leaderboardController.leaderboardDelegate = self; [self presentModalViewController: leaderboardController animated: YES]; }} - (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController{ [self dismissModalViewControllerAnimated: YES]; [viewController release];} - (IBAction) showAchievements{ GKAchievementViewController *achievements = [[GKAchievementViewController alloc] init]; if (achievements != NULL) { achievements.achievementDelegate = self; [self presentModalViewController: achievements animated: YES]; }} - (void)achievementViewControllerDidFinish:(GKAchievementViewController *)viewController;{ [self dismissModalViewControllerAnimated: YES]; [viewController release];}

ننشىء هنا الـ(actions) لإظهار الـ(leaderboard ) و الـ(achievements) 
وأنشأنا أيضا وظيفتين للرجوع، الـ(action) الأول لعرض الـ(leaderboard)، كما نرى فقد قمنا بوضع الـ(timeScope) إلى (GKLeaderboardTimeScopeWeek) و هذا يعنى أن قسم الـ(leaderboard) قد تغير إالى (This Week)، يوجد لدينا 3 أنواع من الـ(timeScope) كالآتى : 
  • GKLeaderboardTimeScopeToday 
  • GKLeaderboardTimeScopeWeek 
  • GKLeaderboardTimeScopeAllTheTime 

ّإذا قمت بالبناء الآن و أعدت التشغيل سوف تعمل أزرار الـ(Show Leaderboard) و الـ(Show Achievements) 
الآن يمكنك أن ترى الـ(Achievements) التى أنشأناها والشرح المرتبط بها و قيمة النقاط، و كما نرى فقسم الـ(leaderboard) مضبوط على (This Week)، بتغيير الـ(Time Scope) فى الـ(Xcode) يمكنك جعل الوضع الافتراضى هو (All Time) أو (Today) . الـ( leaderboard) تقول (No Scores) لأننا لم نحقق أى Score لها، اضغط (Done) لإنهاء الـ(Game Center view).











الخطوة السادسة : التحكم فى الـ(Score) و الـ(Achievements)

أضف الكود الآتى أسفل الكود الذى أنشأناه
- (IBAction) increaseScore{ self.currentScore = self.currentScore + 1; currentScoreLabel.text = [NSString stringWithFormat: @"%ld", self.currentScore]; [self checkAchievements];}
هنا ننشئ (action) لرفع الـ(Score)الحالى، أيضا نقوم بتحديث الجدول إلى الـ(Score) الحالى و نقوم بتجربة الـ(checkAchievements) لرؤية إذا تم تحقيق أى (Achievement) 

- (void) checkAchievements
{
    NSString* identifier = NULL;
    double percentComplete = 0;
    switch(self.currentScore)
    {
        case 1:
        {
            identifier= kAchievementOneTap;
            percentComplete= 100.0;
            break;
        }
        case 5:
        {
            identifier= kAchievement20Taps;
            percentComplete= 25.0;
            break;
        }
        case 10:
        {
            identifier= kAchievement20Taps;
            percentComplete= 50.0;
            break;
        }
        case 15:
        {
            identifier= kAchievement20Taps;
            percentComplete= 75.0;
            break;
        }
        case 20:
        {
            identifier= kAchievement20Taps;
            percentComplete= 100.0;
            break;
        }
     
    }
    if(identifier!= NULL)
    {
        [self.gameCenterManager submitAchievement: identifier percentComplete: percentComplete];
    }
 باستخدام الـ(switch statement) سوف نرى إذا قمنا بتحقيق

(achievement)، أولاً نقوم بإنشاء(NSString) و (double) لتخزين القيم الخاصة بنا ،فى الـ(switch statement ) نتحقق إذا كانت النقاط الحالية 1 أو 5 أو 10 أو 15 أو 20، و بعد الـ(switch statement) نرى إن كان هناك شئ مخزن فى الـ(NSString) الذى أنشأناه، إن كان هناك شئ مخزن فى الـ(NSString) نقوم بعرض الـ(achievement)، نعرض الـ(achievement) أيضا إذا اكتمل جزء منه . مثال: إذا ضغط على الزر 10 مرات لقد أنجزت 50% من إنجاز الـ20 ضغطة .
نريد أيضا عرض أعلى (Score) لذا نضيف هذه الأكواد تحت الأكواد السابقة التى أنشأناها منذ قليل
- (IBAction) submitScore
{
    if(self.currentScore > 0)
    {
        [self.gameCenterManager reportScore: self.currentScore forCategory: self.currentLeaderBoard];
    }
}

هنا نتحقق إذا كان الـ(Score) أعلى من 0 لأننا لا نريد عرضه إذا كان 0، لقد ثبتنا الـ(currentScore) فى الـ(currentLeaderboard) الخاصة بنا.
عند قيامك تشغيل التطبيق من جديد ستجد يمكنك زيادة الـ(Score) الخاص بك و عرضه، و إذا ضغط على الزر 15 ضغطة و ذهبت الى (Show Achievements) سترى أنك أنجزت الـ(1 Tap) و ستكون قد انهيت 75% من الـ(20 Taps).

الشرح الخاص بـإنجاز الـ (1 Tap) الذى أدخلناه فى (iTunes Connect) يتغير عندما يتم استحقاقه، أغلق واجهة (Achievement) و اضغط على (Submit Score) بعد ذلك اضغط (Show Leaderbaord) الآن بإمكانك رؤية الـ(Score) الخاص بك (بشرط أن يكون أكثر من 0).












الخطوة السابعة : إعادة ضبط الـ(Score) و الـ(Achievements) 

ضع الأكواد الآتية تحت الكود الذى أنشأناه

- (IBAction) reset{ UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Are you sure you want to reset your score and achievements?" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Reset" otherButtonTitles:nil]; [actionSheet showInView:[self view]]; [actionSheet release]; }


لقد قمنا الآن بإنشاء (action sheet) فى الـ(reset action) . و ضبطنا الـ(delegate) إالى (self)؛ لأننا نريد حدوث شىء عندما تضغط على زر (reset). 
تحت الـ(reset) ضع الكود الآتى :

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) {
     
        [gameCenterManager resetAchievements];
     
        self.currentScore = 0;
        currentScoreLabel.text = [NSString stringWithFormat: @"%ld", self.currentScore];

    }
}
من هذا الكود نعلم أى زر تم الضغط عليه بواستطك، و لا يمكنك تعديل زر الـ(Cancel) لذا سوف نبدأ من الـ(buttonIndex) بـ0، و إذا ضغطت زر الـ(Reset) فى الـ(Action Sheet) يعيد الـ(gameCenterManager) كل الـ(achievements) الخاصة بك، ويكون الـ(CurrentScore) صفر و نقوم بتحديث نص الـ(currentScoreLabel)
الخطوة الثامنة : إشعار المستخدم بالـ(Achievement) المكتسبة  
ضع الأكواد الآتية تحت الأكواد السابقة


- (void) achievementSubmitted: (GKAchievement*) ach error:(NSError*) error;
{

    if((error == NULL) && (ach != NULL))
    {
        if (ach.percentComplete == 100.0) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Achievement Earned!"
                                                              message:(@"%@",ach.identifier)
                                                             delegate:nil
                                                    cancelButtonTitle:@"OK"
                                                    otherButtonTitles:nil];
            [alert show];
            [alert release];
        }
     
    }
    else
    {
        // Achievement Submission Failed.
 
    }

}

أولا نفحص إذا لم يكن هناك عطل و إذا كان هناك شىء مخزن فى الـ(ach)، إذا كان ذلك صحيحا نتأكد إذا كانت نسبة الـ(ach) المكتملة هى 100.0، لأننا نريد إرسال رسالة للمستخدم  اكتسب الـ(achievement) كامل وليس إذا اكتسب 50% من الـ(achievement).

إذا كان ذلك صحيحا نرى المستخدم أنه اكتسب (achievement) عن طريق الإنذار على الشاشة، ثم نضبط الـ( delegate) لكى تصبح بدون قيمة (nil) لأننا لا نريدها و نريد فقط زر الـ(Cancel). 
أما إذا كان هناك عطل أو لم يكن هناك شىء مخزن بالـ( ach)، تستطيع إرسال رسالة للمستخدم بأن تحقيق الـ(achievement)قد فشل. 
اضغط (build) ثم (run) للإنهاء، للتأكد من عمل زر الـ(reset) و رسالة الإنذار اضغط على زر (Reset Achievements & Score) ثم زد من الـ(Scoure) و يجب أن تظهر لك رسالة الإنذار.




الاستنتاج.
لو اكتسبت الـ 2 (achievements) وأغلقت التطبيق و مسحته من مدير المهام,سيكون الـ(score) الحالى هو 0 مرة أخرى

لأننا لم نخزن هذه القيمة ,إذا رفعت قيمة الـ(Score) أو شعر التطبيق أنك استحقيت (1Tap achievement) مرة أخرى

وأنت استحقيته بالفعل عليك بحفظ الـ(Score) الحالى لكى يحدث هذا.

الكــاتــب

    • مشاركة

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

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