您的位置:首页 > 移动开发 > IOS开发

ios Game-Center 开发 part1

2014-08-13 15:00 253 查看
#pragma mark - 1 对Game Center支持判断
- (BOOL) isGameCenterAvailable
{
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
NSString *reqSysVer =
@"4.1";
NSString *currSysVer = [[UIDevice
currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer
compare:reqSysVer options:NSNumericSearch] !=
NSOrderedAscending);

return (gcClass && osVersionSupported);

}
#pragma mark - 对积分进行操作
//2 用户登录
- (void)authenticateLocalPlayer
{
GKLocalPlayer* localPlayer = [GKLocalPlayer
localPlayer];
if ([localPlayer isAuthenticated] ==
NO) {
localPlayer.authenticateHandler = ^(UIViewController *viewController,
NSError *error) {
if (error) {
// _enableGameCenter = NO;
}else{
// _enableGameCenter = YES;
if(viewController) {
[self
presentViewController:viewController animated:YES
completion:nil];
}
}
};
}else{
//_enableGameCenter = YES;
}
}

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

*/
- (void)reportScore : (NSString*)identifier hiScore:(int64_t)score;
{
if (score < 0 || !_enableGameCenter)
return;
GKScore *scoreBoard = [[GKScore
alloc] 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:表示你的Leaderboard的ID.

*/

- (void) retrieveTopTenScores
{
GKLeaderboard *leaderboardRequest = [[GKLeaderboard
alloc] 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 = [NSArray
arrayWithArray:leaderboardRequest.scores];
for (GKScore *obj
in 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 = [[GKGameCenterViewController
alloc] init];
gameCenterViewController.viewState =
GKGameCenterViewControllerStateLeaderboards;
gameCenterViewController.gameCenterDelegate =
self;
[self
presentViewController:gameCenterViewController animated:YES
completion:nil];
}

/**
5.3玩家信息交互
Game Center最重要的一个功能就是玩家交互.所以,必须检索已经登录玩家的好友信息.根据自己的需要做出设置,比如,可以与好友比较分数,或者好友排行榜等.
//检索已登录用户好友列表
*/
- (void) retrieveFriends
{
GKLocalPlayer *lp = [GKLocalPlayer
localPlayer];
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:identifiers
withCompletionHandler:^(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 ([GKLocalPlayer
localPlayer].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 = [[GKAchievement
alloc] 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 = [[GKGameCenterViewController
alloc] init];
gameCenterViewController.viewState =
GKGameCenterViewControllerStateAchievements;
gameCenterViewController.gameCenterDelegate =
self;
[self
presentViewController:gameCenterViewController animated:YES
completion:nil];
}
/*6.2读取一个成就
方法一:得到所有的成就
函数中NSArray返回的是你的所有成就ID.
*/
- (void) loadAchievements
{
NSMutableDictionary *achievementDictionary = [[NSMutableDictionary
alloc] init];
[GKAchievement
loadAchievementsWithCompletionHandler:^(NSArray *achievements,NSError *error)
{
if (error == nil) {
NSArray *tempArray = [NSArray
arrayWithArray:achievements];
for (GKAchievement *tempAchievement
in tempArray) {
[achievementDictionary setObject:tempAchievement
forKey: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 = [[NSMutableDictionary
alloc] init];
GKAchievement *achievement = [achievementDictionary
objectForKey:identifier];
if (achievement == nil)
{
achievement = [[GKAchievement
alloc] initWithIdentifier:identifier];
[achievementDictionary setObject:achievement
forKey:achievement.identifier];
}
return achievement;
}
/*
6.3获取成就描述和图片
在自定义界面中,玩家需要一个成就描述,以及该成就的图片,Game Center提供了该功能.当然,你也可以自己在程序中完成,毕竟玩家不可能时刻处于在线状态.
*/

- (NSArray*)retrieveAchievmentMetadata
{
//读取成就的描述
[GKAchievementDescription
loadAchievementDescriptionsWithCompletionHandler:
^(NSArray *descriptions,
NSError *error) {
if (error != nil)
{
// process the errors
NSLog(@"读取成就说明出错");
}
if (descriptions !=
nil)
{
// use the achievement descriptions.
for (GKAchievementDescription *achDescription
in 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
{
[self
dismissViewControllerAnimated:YES
completion:nil];
}
/*
4.3用户变更检测0
由于4.0以后系统支持多任务,玩家的机器有可能被不同的玩家接触,导致Game Center上的用户发生变化,当发生变化的时候,程序必须在游戏中通知玩家.
*/
- (void) registerForAuthenticationNotification
{
NSNotificationCenter *nc = [NSNotificationCenter
defaultCenter];
[nc addObserver:self
selector:@selector(authenticationChanged)
name:GKPlayerAuthenticationDidChangeNotificationName
object:nil];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: