GameCenter 使用指南
原地址:http://www.cocoachina.com/gamedev/misc/2010/1022/2229.html
GameCenter 为单机游戏为主的 iPhone 游戏平台引入了社会化特性,更为将来的网游、多人竞技等游戏打下了基础。下面是 CocoaChina 会员 “ljg420811” 总结的 GameCenter 使用指南,包括 GameCenter 的设置和代码实现。
1. iTunes Connect 设置
首先,申请一个应用程序,不必提交.目地是为了得到Bundle ID.
然后设置一下工程中Info.plist的Bundle identifier使之与iTunes Connect中的Bundle ID相同,否则当你尝试登录GameCenter的时候,会提示一个不支持GameCenter的错误.
申请完毕,打开你刚申请的application,点击Manage Game Center选项.

进入后点击Enable Game Center使你的Game Center生效.
接下来就可以设置自己的Leaderboard和Achievements.

2. Leaderboard设置
Leaderboard纵观图如下所示.

1.sort Order: Leaderboard中的内容是以升序还是降序排列.
2.Score Format Type:分数的类型.
3.*Categories:Leaderboard的一个分数榜,这个可以创建多个,比如游戏可以分为Easy,Normal,Hard三个难度,每个难度一个榜.

*设置完成后保存,完成了一个 Leaderboard的设置.我们可以根据需要添加多个 leaderboard.
4.**Score Format Location: leaderboard支持的语言.

**可以支持多种语言,每支持一种语言,需要完成一个上述操作.
这个时候右下角会出现save change按钮,点击完成leaderboard的设置.
你可以根据需要随时更改你的leaderboard,操作与上述内容类似.
3. Achievements设置
Achievements界面内容比较少,点击左上角的Add New Achievement,打开如下图所示的Achievements创建界面.

Hidden:表示该成就为解锁前玩家是否可见.
Achievement ID:程序通过这个属性来识别成就.
*Achievement Localization:该成就支持的语言.
*Achievement Localization设置如下图所示.

*其中,成就的Image必须是512X512,72DPI的.
一切设置完成后,点击save change按钮即完成一个成就的设置.
4.总体功能
在使用各个功能前,你需要了解一下块函数。传送门: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html
4.1 对Game Center支持判断
1. - (BOOL) isGameCenterAvailable
2. {
3. Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
4. NSString *reqSysVer = @"4.1";
5. NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
6. BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
7.
8. return (gcClass && osVersionSupported);
9. }
4.2用户登录
1. - (void) authenticateLocalPlayer
2. {
3. [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error){
4. if (error == nil) {
5. //成功处理
6. NSLog(@"成功");
7. NSLog(@"1--alias--.%@",[GKLocalPlayer localPlayer].alias);
8. NSLog(@"2--authenticated--.%d",[GKLocalPlayer localPlayer].authenticated);
9. NSLog(@"3--isFriend--.%d",[GKLocalPlayer localPlayer].isFriend);
10. NSLog(@"4--playerID--.%@",[GKLocalPlayer localPlayer].playerID);
11. NSLog(@"5--underage--.%d",[GKLocalPlayer localPlayer].underage);
12. }else {
13. //错误处理
14. NSLog(@"失败 %@",error);
15. }
16. }];
17. }
对于开发者来说,Game Center必须经过测试才能上线,没有上线的程序在测试环境中登录时会出现sandbox提示.如图.
4.3用户变更检测
由于4.0以后系统支持多任务,玩家的机器有可能被不同的玩家接触,导致Game Center上的用户发生变化,当发生变化的时候,程序必须在游戏中通知玩家.
1. - (void) registerForAuthenticationNotification
2. {
3. NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
4. [nc addObserver:self
5. selector:@selector(authenticationChanged)
6. name:GKPlayerAuthenticationDidChangeNotificationName
7. object:nil];
8. }
9.
10. - (void) authenticationChanged
11. {
12. if ([GKLocalPlayer localPlayer].isAuthenticated)
13. {
14. ;// Insert code here to handle a successful authentication.
15. }
16. else
17. {
18. ;// Insert code here to clean up any outstanding Game Center-related classes.
19. }
20. }
5.对Leaderboard进行操作
5.1上传一个分数
1. - (void) reportScore: (int64_t) score forCategory: (NSString*) category
2. {
3. GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
4. scoreReporter.value = score;
5.
6. [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
7. if (error != nil)
8. {
9. // handle the reporting error
10. NSLog(@"上传分数出错.");
11. //If your application receives a network error, you should not discard the score.
12. //Instead, store the score object and attempt to report the player’s process at
13. //a later time.
14. }else {
15. NSLog(@"上传分数成功");
16. }
17.
18. }];
19. }
当上传分数出错的时候,要将上传的分数存储起来,比如将SKScore存入一个NSArray中.等可以上传的时候再次尝试.
5.2下载一个分数
1. //GKScore objects provide the data your application needs to create a custom view.
2. //Your application can use the score object’s playerID to load the player’s alias.
3. //The value property holds the actual value you reported to Game Center. the formattedValue
4. //property provides a string with the score value formatted according to the parameters
5. //you provided in iTunes Connect.
6. - (void) retrieveTopTenScores
7. {
8. GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
9. if (leaderboardRequest != nil)
10. {
11. leaderboardRequest.playerScope = GKLeaderboardPlayerScopeGlobal;
12. leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime;
13. leaderboardRequest.range = NSMakeRange(1,10);
14. leaderboardRequest.category = @"TS_LB";
15. [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {
16. if (error != nil){
17. // handle the error.
18. NSLog(@"下载失败");
19. }
20. if (scores != nil){
21. // process the score information.
22. NSLog(@"下载成功....");
23. NSArray *tempScore = [NSArray arrayWithArray:leaderboardRequest.scores];
24. for (GKScore *obj in tempScore) {
25. NSLog(@" playerID : %@",obj.playerID);
26. NSLog(@" category : %@",obj.category);
27. NSLog(@" date : %@",obj.date);
28. NSLog(@" formattedValue : %@",obj.formattedValue);
29. NSLog(@" value : %d",obj.value);
30. NSLog(@" rank : %d",obj.rank);
31. NSLog(@"**************************************");
32. }
33. }
34. }];
35. }
36. }
说明:
1) playerScope:表示检索玩家分数范围.
2) timeScope:表示某一段时间内的分数
3) range:表示分数排名的范围
4) category:表示你的Leaderboard的ID.
5.3玩家信息交互
Game Center最重要的一个功能就是玩家交互.所以,必须检索已经登录玩家的好友信息.根据自己的需要做出设置,比如,可以与好友比较分数,或者好友排行榜等.
//检索已登录用户好友列表
1. - (void) retrieveFriends
2. {
3. GKLocalPlayer *lp = [GKLocalPlayer localPlayer];
4. if (lp.authenticated)
5. {
6. [lp loadFriendsWithCompletionHandler:^(NSArray *friends, NSError *error) {
7. if (error == nil)
8. {
9. [self loadPlayerData:friends];
10. }
11. else
12. {
13. ;// report an error to the user.
14. }
15. }];
16.
17. }
18. }
上面的friends得到的只是一个身份列表,里面存储的是NSString,想要转换成好友ID,必须调用- (void) loadPlayerData: (NSArray *) identifiers方法,该方法得到的array里面存储的才是GKPlayer对象.如下
1. /*
2. Whether you received player identifiers by loading the identifiers for the local player’s
3. friends, or from another Game Center class, you must retrieve the details about that player
4. from Game Center.
5. */
6. - (void) loadPlayerData: (NSArray *) identifiers
7. {
8. [GKPlayer loadPlayersForIdentifiers:identifiers withCompletionHandler:^(NSArray *players, NSError *error) {
9. if (error != nil)
10. {
11. // Handle the error.
12. }
13. if (players != nil)
14. {
15. NSLog(@"得到好友的alias成功");
16. GKPlayer *friend1 = [players objectAtIndex:0];
17. NSLog(@"friedns---alias---%@",friend1.alias);
18. NSLog(@"friedns---isFriend---%d",friend1.isFriend);
19. NSLog(@"friedns---playerID---%@",friend1.playerID);
20. }
21. }];
22. }
至此,leaderboard功能介绍完毕
6.对Achievement进行操作
这一部分内容比较多,而且有的地方有点重复的感觉.
6.1汇报一个成就的进度
对于一个玩家可见的成就,你需要尽可能的报告给玩家解锁的进度;对于一个一部完成的成就,则不需要,当玩家的进度达到100%的时候,会自动解锁该成就.
1. - (void) reportAchievementIdentifier: (NSString*) identifier percentComplete: (float) percent
2. {
3. GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease];
4. if (achievement)
5. {
6. achievement.percentComplete = percent;
7. [achievement reportAchievementWithCompletionHandler:^(NSError *error)
8. {
9. if (error != nil)
10. {
11. //The proper way for your application to handle network errors is retain
12. //the achievement object (possibly adding it to an array). Then, periodically
13. //attempt to report the progress until it is successfully reported.
14. //The GKAchievement class supports the NSCoding protocol to allow your
15. //application to archive an achie
16. NSLog(@"报告成就进度失败 ,错误信息为: \n %@",error);
17. }else {
18. //对用户提示,已经完成XX%进度
19. NSLog(@"报告成就进度---->成功!");
20. NSLog(@" completed:%d",achievement.completed);
21. NSLog(@" hidden:%d",achievement.hidden);
22. NSLog(@" lastReportedDate:%@",achievement.lastReportedDate);
23. NSLog(@" percentComplete:%f",achievement.percentComplete);
24. NSLog(@" identifier:%@",achievement.identifier);
25. }
26. }];
27. }
28. }
其中该函数的参数中identifier是你成就的ID, percent是该成就完成的百分比
6.2读取一个成就
方法一:得到所有的成就
1. - (void) loadAchievements
2. {
3. NSMutableDictionary *achievementDictionary = [[NSMutableDictionary alloc] init];
4. [GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements,NSError *error)
5. {
6. if (error == nil) {
7. NSArray *tempArray = [NSArray arrayWithArray:achievements];
8. for (GKAchievement *tempAchievement in tempArray) {
9. [achievementDictionary setObject:tempAchievement forKey:tempAchievement.identifier];
10. NSLog(@" completed:%d",tempAchievement.completed);
11. NSLog(@" hidden:%d",tempAchievement.hidden);
12. NSLog(@" lastReportedDate:%@",tempAchievement.lastReportedDate);
13. NSLog(@" percentComplete:%f",tempAchievement.percentComplete);
14. NSLog(@" identifier:%@",tempAchievement.identifier);
15. }
16. }
17. }];
18. }
函数中NSArray返回的是你的所有成就ID.
方法二:根据ID获取成就
1. - (GKAchievement*) getAchievementForIdentifier: (NSString*) identifier
2. {
3. NSMutableDictionary *achievementDictionary = [[NSMutableDictionary alloc] init];
4. GKAchievement *achievement = [achievementDictionary objectForKey:identifier];
5. if (achievement == nil)
6. {
7. achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
8. [achievementDictionary setObject:achievement forKey:achievement.identifier];
9. }
10. return [[achievement retain] autorelease];
11. }
6.3获取成就描述和图片
在自定义界面中,玩家需要一个成就描述,以及该成就的图片,Game Center提供了该功能.当然,你也可以自己在程序中完成,毕竟玩家不可能时刻处于在线状态.
1. - (NSArray*)retrieveAchievmentMetadata
2. {
3. //读取成就的描述
4. [GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:
5. ^(NSArray *descriptions, NSError *error) {
6. if (error != nil)
7. {
8. // process the errors
9. NSLog(@"读取成就说明出错");
10. }
11. if (descriptions != nil)
12. {
13. // use the achievement descriptions.
14. for (GKAchievementDescription *achDescription in descriptions) {
15. NSLog(@"1..identifier..%@",achDescription.identifier);
16. NSLog(@"2..achievedDescription..%@",achDescription.achievedDescription);
17. NSLog(@"3..title..%@",achDescription.title);
18. NSLog(@"4..unachievedDescription..%@",achDescription.unachievedDescription);
19. NSLog(@"5............%@",achDescription.image);
20.
21. //获取成就图片,如果成就未解锁,返回一个大文号
22. /*
23. [achDescription loadImageWithCompletionHandler:^(UIImage *image, NSError *error) {
24. if (error == nil)
25. {
26. // use the loaded image. The image property is also populated with the same image.
27. NSLog(@"成功取得成就的图片");
28. UIImage *aImage = image;
29. UIImageView *aView = [[UIImageView alloc] initWithImage:aImage];
30. aView.frame = CGRectMake(50, 50, 200, 200);
31. aView.backgroundColor = [UIColor clearColor];
32. [[[CCDirector sharedDirector] openGLView] addSubview:aView];
33. }else {
34. NSLog(@"获得成就图片失败");
35. }
36. }];
37. */
38. }
39. }
40. }];
41. return nil;
42. }
如果你不主动使用注释中的方法,那么你得到的description中不会有图片,这样可以减少网络的使用,尽量少下载东西.当使用注释中的代码时,如果成就已经解锁,则返回该成就的图标,如果没有解锁,则返回一个大问号,至于未解锁图标是否可以自定义,我找寻的结果好像是不可以.
GameCenter 使用指南的更多相关文章
- AppStore SDK
ios审核被拒4.3 http://www.cocoachina.com/bbs/read.php?tid-1731757.html ios审核4.3被拒? 别担心 这几步让你的 App 顺利过审 h ...
- 【iOS开发必备指南合集】申请企业级IDP、真机调试、游戏接入GameCenter 指南(实现仿官方的成就提示)、游戏接入OpenFeint指南;
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...
- iOS开发必备指南合集之游戏接入GameCenter 指南
原地址:http://bbs.9ria.com/thread-248408-1-1.html iTunes Connect 设置 首先,申请一个应用程序,不必提交.目地是为了得到Bundle ID. ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- UE4新手之编程指南
虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- Atitit.研发管理软件公司的软资产列表指南
Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...
随机推荐
- Spring 什么是 IOC 控制反转 ?什么是依赖注入?spring的用处 好处 为什么要用
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha Spring是一个开源的控制反转(Inversion of Control ,IoC)和 ...
- 课堂实验-Bag
这次的课堂实验比较简单,但尴尬的是竟然没有做出来,自己的代码能力下降了不少.IDEA的Junit测试出了问题.所以这次实验是和结对伙伴结对编程写的. public class Bag<T> ...
- ElasticSearch学习笔记--1、安装以及运行
Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎,多的我就不细说了. 相关实验环境 Centos:7.3 ElasticSearch:5.6 java:1.8 1. ...
- java-银行卡基本信息查询
用于验证的请求接口: https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo= ...
- Python 实现简单的感知机算法
感知机 随机生成一些点和一条原始直线,然后用感知机算法来生成一条直线进行分类,比较差别 导入包并设定画图尺寸 import numpy as np import matplotlib.pyplot a ...
- QTP 10 破解 之路
1.下载QTP 10 安装包 2.破解软件(mgn-mqt82.exe) (阿里云云主机里执行不了,一执行CPU就99%,也没有生成lservrc) 手动创建C:\Program Files (x8 ...
- sublime在高分辨率屏幕下,左侧边栏字体问题
因为新的笔记本是1920*1080分辨率的屏幕,在打开sublime的时候,侧边栏的文件夹名字会变得很小,虽然很清晰,但是太小了看起来很吃力, 如下图所示 网上找了很多的方法试了好久没有成功,一天闲下 ...
- zookeeper疑难杂症
1.zookeeper是怎么写数据的?因为是master写再同步广播到follow节点,如果master写完,following在写的过程中出现失败怎么办? :zookeeper支持原子的写入操作,要 ...
- linkhashmap实现原理
HashMap和双向链表合二为一即是LinkedHashMap.所谓LinkedHashMap,其落脚点在HashMap,因此更准确地说,它是一个将所有Entry节点链入一个双向链表的HashMap. ...
- Andriod for arcgis 字段属性
Feature pFeature = selFeatureLayer.getFeature(8); Log.d("FID===", "" + pFeature. ...