ios Game-Center 开发 part1

来源:互联网 发布:windows改变图标 编辑:程序博客网 时间:2024/09/21 08:57



#pragma mark - 1 Game Center支持判断

- (BOOL) isGameCenterAvailable

{

    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

    NSString *reqSysVer = @"4.1";

    NSString *currSysVer = [[UIDevicecurrentDevice] systemVersion];

    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] !=NSOrderedAscending);

    

    return (gcClass && osVersionSupported);

    

}

#pragma mark - 对积分进行操作

//2 用户登录

- (void)authenticateLocalPlayer

{

    GKLocalPlayer* localPlayer      = [GKLocalPlayerlocalPlayer];

    if ([localPlayer isAuthenticated] ==NO) {

        localPlayer.authenticateHandler = ^(UIViewController *viewController,

                                            NSError *error) {

            if (error) {

                // _enableGameCenter = NO;

            }else{

                //  _enableGameCenter = YES;

                if(viewController) {

                    [self presentViewController:viewController animated:YEScompletion:nil];

                }

            }

        };

    }else{

        //_enableGameCenter = YES;

    }

}


/**

 上传积分    //当上传分数出错的时候,要将上传的分数存储起来,比如将SKScore存入一个NSArray.等可以上传的时候再次尝试.

 

 

 */

- (void)reportScore : (NSString*)identifier hiScore:(int64_t)score;

{

    if (score < 0 || !_enableGameCenter)

        return;

    GKScore *scoreBoard = [[GKScorealloc] initWithLeaderboardIdentifier:identifier];

    scoreBoard.value    = score;

    [GKScore reportScores:@[scoreBoard]withCompletionHandler:^(NSError *error) {

        if (error) {

            // handle error

            NSLog(@"上传分数出错.");

            

        }else{

            

            NSLog(@"上传分数成功");

        }

    }];

}

/**

 5.2下载一个分数

 说明:

 1)    playerScope:表示检索玩家分数范围.

 2)    timeScope:表示某一段时间内的分数

 3)    range:表示分数排名的范围

 4)    category:表示你的LeaderboardID.

 

 */


- (void) retrieveTopTenScores

{

    GKLeaderboard *leaderboardRequest = [[GKLeaderboardalloc] init];

    if (leaderboardRequest != nil)

    {

        leaderboardRequest.playerScope =GKLeaderboardPlayerScopeGlobal;

        leaderboardRequest.timeScope   =GKLeaderboardTimeScopeAllTime;

        leaderboardRequest.range       = NSMakeRange(1,10);

        //  leaderboardRequest.category = @"TS_LB";

        [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores,NSError *error) {

            if (error != nil){

                // handle the error.

                NSLog(@"下载失败");

            }

            if (scores != nil){

                // process the score information.

                NSLog(@"下载成功....");

                NSArray *tempScore = [NSArrayarrayWithArray:leaderboardRequest.scores];

                for (GKScore *objin tempScore) {

                    NSLog(@"    playerID            : %@",obj.playerID);

                    //  NSLog(@"    category            : %@",obj.category);

                    NSLog(@"    date                : %@",obj.date);

                    NSLog(@"    formattedValue    : %@",obj.formattedValue);

                    NSLog(@"    value                : %lld",obj.value);

                    NSLog(@"    rank                : %ld",(long)obj.rank);

                    NSLog(@"**************************************");

                }

            }

        }];

    }

}

/**

 显示排行榜

 */

- (void)showLeaderboard : (NSString*)leaderboard

{

    if (!_enableGameCenter)

        return;

    GKGameCenterViewController *gameCenterViewController = [[GKGameCenterViewControlleralloc] init];

    gameCenterViewController.viewState                   =GKGameCenterViewControllerStateLeaderboards;

    gameCenterViewController.gameCenterDelegate          =self;

    [selfpresentViewController:gameCenterViewController animated:YEScompletion:nil];

}


/**

 5.3玩家信息交互

 Game Center最重要的一个功能就是玩家交互.所以,必须检索已经登录玩家的好友信息.根据自己的需要做出设置,比如,可以与好友比较分数,或者好友排行榜等.

 //检索已登录用户好友列表

 */

- (void) retrieveFriends

{

    GKLocalPlayer *lp = [GKLocalPlayerlocalPlayer];

    if (lp.authenticated)

    {

        [lp loadFriendsWithCompletionHandler:^(NSArray *friends,NSError *error) {

            if (error == nil)

            {

                [self loadPlayerData:friends];

            }

            else

            {

                ;// report an error to the user.

            }

        }];


    }

}

/*

 上面的friends得到的只是一个身份列表,里面存储的是NSString,想要转换成好友ID,必须调用- (void) loadPlayerData: (NSArray *) identifiers方法,该方法得到的array里面存储的才是GKPlayer对象.如下

 */


- (void) loadPlayerData: (NSArray *) identifiers

{

    [GKPlayer loadPlayersForIdentifiers:identifierswithCompletionHandler:^(NSArray *players,NSError *error) {

        if (error != nil)

        {

            // Handle the error.

        }

        if (players != nil)

        {

            NSLog(@"得到好友的alias成功");

            GKPlayer *friend1 = [players objectAtIndex:0];

            NSLog(@"friedns---alias---%@",friend1.alias);

            NSLog(@"friedns---isFriend---%d",friend1.isFriend);

            NSLog(@"friedns---playerID---%@",friend1.playerID);

        }

    }];

}




- (void) authenticationChanged

{

    if ([GKLocalPlayerlocalPlayer].isAuthenticated)

    {

        ;// Insert code here to handle a successful authentication.

    }

    else

    {

        ;// Insert code here to clean up any outstanding Game Center-related classes.

    }

}



# pragma  mark Achievement (成就)进行操作

/**

 上传成就 

 其中该函数的参数中identifier是你成就的ID, percent是该成就完成的百分比

 对于一个玩家可见的成就,你需要尽可能的报告给玩家解锁的进度;对于一个一部完成的成就,则不需要,当玩家的进度达到100%的时候,会自动解锁该成就.

 */

- (void)reportAchievementIdentifier : (NSString*)identifier percentComplete:(float)percent

{

    if (percent < 0 || !_enableGameCenter)

        return;

    GKAchievement *achievement = [[GKAchievementalloc] initWithIdentifier: identifier];

    if (achievement){

        achievement.percentComplete = percent;

        [GKAchievement reportAchievements:@[achievement]withCompletionHandler:^(NSError *error) {

            if (error) {

                // handle error

            }

        }];

    }

}

/*  ios7 启用

- (void) reportAchievementIdentifier: (NSString*) identifier percentComplete: (float) percent

{

    GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier: identifier] ;

    if (achievement)

    {

        achievement.percentComplete = percent;

        [achievement reportAchievementWithCompletionHandler:^(NSError *error)

         {

             if (error != nil)

             {

                 //The proper way for your application to handle network errors is retain

                 //the achievement object (possibly adding it to an array). Then, periodically

                 //attempt to report the progress until it is successfully reported.

                 //The GKAchievement class supports the NSCoding protocol to allow your

                 //application to archive an achie

                 NSLog(@"报告成就进度失败 ,错误信息为: \n %@",error);

             }else {

                 //对用户提示,已经完成XX%进度

                 NSLog(@"报告成就进度---->成功!");

                 NSLog(@"    completed:%d",achievement.completed);

                 NSLog(@"    hidden:%d",achievement.hidden);

                 NSLog(@"    lastReportedDate:%@",achievement.lastReportedDate);

                 NSLog(@"    percentComplete:%f",achievement.percentComplete);

                 NSLog(@"    identifier:%@",achievement.identifier);

             }

         }];

    }

}

 */



/**

 显示成就 跳转到 game center

 */

- (void)showAchievements

{

    if (!_enableGameCenter)

        return;

    

    GKGameCenterViewController *gameCenterViewController = [[GKGameCenterViewControlleralloc] init];

    gameCenterViewController.viewState =GKGameCenterViewControllerStateAchievements;

    gameCenterViewController.gameCenterDelegate =self;

    [selfpresentViewController:gameCenterViewController animated:YEScompletion:nil];

}

/*6.2读取一个成就

方法一:得到所有的成就

 函数中NSArray返回的是你的所有成就ID.

*/

- (void) loadAchievements

{

    NSMutableDictionary *achievementDictionary = [[NSMutableDictionaryalloc] init];

    [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements,NSError *error)

     {

         if (error == nil) {

             NSArray *tempArray = [NSArrayarrayWithArray:achievements];

             for (GKAchievement *tempAchievementin tempArray) {

                 [achievementDictionary setObject:tempAchievementforKey:tempAchievement.identifier];

                 NSLog(@"    completed:%d",tempAchievement.completed);

                 // NSLog(@"    hidden:%d",tempAchievement.hidden);

                 NSLog(@"    lastReportedDate:%@",tempAchievement.lastReportedDate);

                 NSLog(@"    percentComplete:%f",tempAchievement.percentComplete);

                 NSLog(@"    identifier:%@",tempAchievement.identifier);

             }

         }

     }];

}


//方法二:根据ID获取成就


- (GKAchievement*) getAchievementForIdentifier: (NSString*) identifier

{

    NSMutableDictionary *achievementDictionary = [[NSMutableDictionaryalloc] init];

    GKAchievement *achievement = [achievementDictionaryobjectForKey:identifier];

    if (achievement == nil)

    {

        achievement = [[GKAchievement alloc] initWithIdentifier:identifier];

        [achievementDictionary setObject:achievementforKey:achievement.identifier];

    }

    return achievement;

}

/*

 6.3获取成就描述和图片

 在自定义界面中,玩家需要一个成就描述,以及该成就的图片,Game Center提供了该功能.当然,你也可以自己在程序中完成,毕竟玩家不可能时刻处于在线状态.

 */


- (NSArray*)retrieveAchievmentMetadata

{

    //读取成就的描述

    [GKAchievementDescriptionloadAchievementDescriptionsWithCompletionHandler:

     ^(NSArray *descriptions, NSError *error) {

         if (error != nil)

         {

             // process the errors

             NSLog(@"读取成就说明出错");

         }

         if (descriptions != nil)

         {

             // use the achievement descriptions.

             for (GKAchievementDescription *achDescriptionin descriptions) {

                 NSLog(@"1..identifier..%@",achDescription.identifier);

                 NSLog(@"2..achievedDescription..%@",achDescription.achievedDescription);

                 NSLog(@"3..title..%@",achDescription.title);

                 NSLog(@"4..unachievedDescription..%@",achDescription.unachievedDescription);

                 //  NSLog(@"5............%@",achDescription.image);

                 

                 

                 /*

                  如果你不主动使用注释中的方法,那么你得到的description中不会有图片,这样可以减少网络的使用,尽量少下载东西.当使用注释中的代码时,如果成就已经解锁,则返回该成就的图标,如果没有解锁,则返回一个大问号,至于未解锁图标是否可以自定义,我找寻的结果好像是不可以.

                  */

                 //获取成就图片,如果成就未解锁,返回一个大文号

                 /*

                  [achDescription loadImageWithCompletionHandler:^(UIImage *image, NSError *error) {

                  if (error == nil)

                  {

                  // use the loaded image. The image property is also populated with the same image.

                  NSLog(@"成功取得成就的图片");

                  UIImage *aImage = image;

                  UIImageView *aView = [[UIImageView alloc] initWithImage:aImage];

                  aView.frame = CGRectMake(50, 50, 200, 200);

                  aView.backgroundColor = [UIColor clearColor];

                  [[[CCDirector sharedDirector] openGLView] addSubview:aView];

                  }else {

                  NSLog(@"获得成就图片失败");

                  }

                  }];

                  */

             }

         }

     }];

    return nil;

}

//GameCenter  成就提示更新:

//1. iOS5以及更高SDK中,apple已经提供官方的成就提示:方法很简单,代码如下:

/*

 “showsCompletionBanner”属性设置成YES,提交给苹果。新iOS属性“showsCompletionBanner”,其默认设置是NO,但若将其调整成YES,屏幕就呈现包含成就标题和描述的漂亮横幅

 */

- (void)sendAchievement:(GKAchievement *)achievement {

    

    achievement.percentComplete =100.0;   //Indicates the achievement is done

    achievement.showsCompletionBanner =YES;    //Indicate that a banner should be shown

    [GKAchievement reportAchievements:@[achievement]withCompletionHandler:

     ^(NSError *error){

         dispatch_async(dispatch_get_main_queue(), ^(void)

                        {

                            if (error == NULL) {

                                NSLog(@"Successfully sent archievement!");

                            } else {

                                NSLog(@"Achievement failed to send... will try again \

                                      later.  Reason: %@", error.localizedDescription);

                            }  

                        });  

     }];  

}


#pragma mark gameCenterViewController Close回调


- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController

{

    [selfdismissViewControllerAnimated:YEScompletion:nil];

}

/*

 4.3用户变更检测0

 由于4.0以后系统支持多任务,玩家的机器有可能被不同的玩家接触,导致Game Center上的用户发生变化,当发生变化的时候,程序必须在游戏中通知玩家.

 */

- (void) registerForAuthenticationNotification

{

    NSNotificationCenter *nc = [NSNotificationCenterdefaultCenter];

    [nc addObserver:self

           selector:@selector(authenticationChanged)

               name:GKPlayerAuthenticationDidChangeNotificationName

             object:nil];

}

0 0
原创粉丝点击