游戏多少个gamealertviewcontrollerr

Write the code ,change the world!
GameCenter服务
Game Center是由苹果发布的在线多人游戏社交网络,通过它游戏玩家可以邀请好友进行多人游戏,它也会记录玩家的成绩并在排行榜中展示,同时玩家每经过一定 的阶段会获得不同的成就。这里就简单介绍一下如何在自己的应用中集成Game Center服务来让用户获得积分、成就以及查看游戏排行和已获得成就。
由 于Game Center是苹果推出的一项重要服务,苹果官方对于它的控制相当严格,因此使用Game Center之前必须要做许多准备工作。通常需要经过以下几个步骤(下面的准备工作主要是针对真机的,模拟器省略Provisioning Profile配置过程):
在苹果开发者中心创建支持Game Center服务的App ID并指定具体的Bundle ID,假设是&com.cmjstudio.kctest&(注意这个Bundle ID就是日后要开发的游戏的Bundle ID)。
基 于&com.cmjstudio.kctest&创建开发者配置文件(或描述文件)并导入对应的设备(创建过程中选择支持Game Center服务的App ID,这样iOS设备在运行指定Boundle ID应用程序就知道此应用支持Game Center服务)。
在iTunes Connect中创建一个应用(假设叫&KCTest&,这是一款足球竞技游戏)并指定&套装ID&为之前创建的&com.cmjstudio.kctest&,让应用和这个App关联(注意这个应用不需要提交)。
在iTunes Connect的&用户和职能&中创建沙盒测试用户(由于在测试阶段应用还没有正式提交到App Store,所以只有沙盒用户可以登录Game Center)。
在iTunes Connect中配置此应用Game Center(这里配置了游戏在游戏中心的显示名称为&CMJ&),在其中添加排行榜和成就(假设添加一个排行榜ID&Goals&表示进球个数;两个成 就ID分别为&AdidasGoldBall&、&AdidasGoldBoot&代表金球奖和金靴奖成就,点数分别为80、100)。
在iOS&设置&中找到Game Center允许沙盒,否则真机无法调试(如果是模拟器不需要此项设置)。
有了以上准备就可以在应用程序中增加积分、添加成就了,当然在实际开发过程积分和成就都是基于玩家所通过的关卡来完成的,为了简化这个过程这里就直接通过几个按钮手动触发这些事件。Game Center开发需要使用GameKit框架,首先熟悉一下常用的几个类:
GKLocalPlayer:表示本地玩家,在GameKit中还有一个GKPlayer表示联机玩家,为了保证非联网用户也可以正常使用游戏功能,一般使用GKLocalPlayer。
GKScore:管理游戏积分,例如设置积分、排名等。
GKLeaderboard:表示游戏排行榜,主用用于管理玩家排名,例如加载排行榜、设置默认排行榜、加载排行榜图片等。
GKAchievement:表示成就,主用用于管理玩家成就,例如加载成就、提交成就,重置成就等。
GKAchievementDescription:成就描述信息,包含成就的标题、获得前描述、获得后描述、是否可重复获得成就等信息。
GKGameCenterViewController:排行榜、成就查看视图控制器。如果应用本身不需要自己开发排行榜、成就查看试图可以直接调用此控制器。
下 面就以一个简单的示例来完成排行榜、成就设置和查看,在这个演示程序中通过两种方式来查看排行和成就:一种是直接使用框架自带的 GKGameCenterViewContrller调用系统视图查看,另一种是通过API自己读取排行榜、成就信息并显示。此外在应用中有两个添加按钮 分别用于设置得分和成就。应用大致布局如下:
1.首先看一下主视图控制器KCMainTableViewController:
主 视图控制器调用GKLeaderboard的loadLeaderboardsWithCompletionHandler:方法加载了所有排行榜,这个 过程需要注意每个排行榜(GKLeaderboard)中的scores属性是没有值的,如果要让每个排行榜的scores属性有值必须调用一次排行榜的 loadScoresWithCompletionHandler:方法。
调用GKAchievement的 loadAchievementsWithCompletionHandler:方法加载加载成就,注意这个方法只能获得完成度不为0的成就,如果完成度 为0是获得不到的;然后调用GKAchievementDesciption的 loadAchievementDescriptionsWithCompletionHandler:方法加载了所有成就描述,这里加载的是所有成就描 述(不管完成度是否为0);紧接着调用了每个成就描述的loadImageWithCompletionHandler:方法加载成就图片。
将获得的排行榜、成就、成就描述、成就图片信息保存,并在导航到详情视图时传递给排行榜视图控制器和成就视图控制器以便在子控制器视图中展示。
在主视图控制器左上方添加查看游戏中心控制按钮,点击按钮调用GKGameCenterViewController来展示排行榜、成就、玩家信息,这是系统自带的一个游戏中心视图方便和后面我们自己获得的信息对比。
KCMainTableViewController.m
Created by Kenshin Cui on 14/4/5.
Copyright (c) 2015年 cmjstudio. All rights reserved.
8 #import "KCMainTableViewController.h"
10 #import "KCLeaderboardTableViewController.h"
11 #import "KCAchievementTableViewController.h"
12 @interface KCMainTableViewController ()
13 @property (strong,nonatomic) NSArray *//排行榜对象数组
14 @property (strong,nonatomic) NSArray *//成就
15 @property (strong,nonatomic) NSArray *achievementD//成就描述
16 @property (strong,nonatomic) NSMutableDictionary *achievementI//成就图片
17 @property (weak, nonatomic) IBOutlet UILabel *leaderboardL //排行个数
18 @property (weak, nonatomic) IBOutlet UILabel *achievementL //成就个数
20 @implementation KCMainTableViewController
21 #pragma mark - 控制器视图事件
22 - (void)viewDidLoad {
[super viewDidLoad];
[self authorize];
26 #pragma mark - UI事件
27 - (IBAction)viewGameCenterClick:(UIBarButtonItem *)sender {
[self viewGameCenter];
30 #pragma mark - GKGameCenterViewController代理方法
31 //点击完成
32 -(void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController{
NSLog(@"完成.");
[gameCenterViewController dismissViewControllerAnimated:YES completion:nil];
36 #pragma mark -导航
37 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//如果是导航到排行榜,则将当前排行榜传递到排行榜视图
if ([segue.identifier isEqualToString:@"leaderboard"]) {
UINavigationController *navigationController=segue.destinationViewC
KCLeaderboardTableViewController *leaderboardController=[navigationController.childViewControllers firstObject];
leaderboardController.leaderboards=self.
}else if ([segue.identifier isEqualToString:@"achievement"]) {
UINavigationController *navigationController=segue.destinationViewC
KCAchievementTableViewController *achievementController=[navigationController.childViewControllers firstObject];
achievementController.achievements=self.
achievementController.achievementDescriptions=self.achievementD
achievementController.achievementImages=self.achievementI
51 #pragma mark - 私有方法
52 //检查是否经过认证,如果没经过认证则弹出Game Center登录界面
53 -(void)authorize{
//创建一个本地用户
GKLocalPlayer *localPlayer= [GKLocalPlayer localPlayer];
//检查用于授权,如果没有登录则让用户登录到GameCenter(注意此事件设置之后或点击登录界面的取消按钮都会被调用)
[localPlayer setAuthenticateHandler:^(UIViewController * controller, NSError *error) {
if ([[GKLocalPlayer localPlayer] isAuthenticated]) {
NSLog(@"已授权.");
[self setupUI];
//注意:在设置中找到Game Center,设置其允许沙盒,否则controller为nil
presentViewController:controller animated:YES completion:nil];
67 //UI布局
68 -(void)setupUI{
//更新排行榜个数
[GKLeaderboard loadLeaderboardsWithCompletionHandler:^(NSArray *leaderboards, NSError *error) {
if (error) {
NSLog(@"加载排行榜过程中发生错误,错误信息:%@",error.localizedDescription);
self.leaderboards=
self.leaderboardLabel.text=[NSString stringWithFormat:@"%i",leaderboards.count];
//获取得分,注意只有调用了loadScoresWithCompletionHandler:方法之后leaderboards中的排行榜中的scores属性才有值,否则为nil
[leaderboards enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
GKLeaderboard *leaderboard=
[leaderboard loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) {
//更新获得成就个数,注意这个个数不一定等于iTunes Connect中的总成就个数,此方法只能获取到成就完成进度不为0的成就
[GKAchievement loadAchievementsWithCompletionHandler:^(NSArray *achievements, NSError *error) {
if (error) {
NSLog(@"加载成就过程中发生错误,错误信息:%@",error.localizedDescription);
self.achievements=
self.achievementLable.text=[NSString stringWithFormat:@"%i",achievements.count];
//加载成就描述(注意,即使没有获得此成就也能获取到)
[GKAchievementDescription loadAchievementDescriptionsWithCompletionHandler:^(NSArray *descriptions, NSError *error) {
if (error) {
NSLog(@"加载成就描述信息过程中发生错误,错误信息:%@",error.localizedDescription);
self.achievementDescriptions=
//加载成就图片
_achievementImages=[NSMutableDictionary dictionary];
[descriptions enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
GKAchievementDescription *description=(GKAchievementDescription *)
[description loadImageWithCompletionHandler:^(UIImage *image, NSError *error) {
[_achievementImages setObject:image forKey:description.identifier];
108 //查看Game Center
109 -(void)viewGameCenter{
if (![GKLocalPlayer localPlayer].isAuthenticated) {
NSLog(@"未获得用户授权.");
//Game Center视图控制器
GKGameCenterViewController *gameCenterController=[[GKGameCenterViewController alloc]init];
//设置代理
gameCenterController.gameCenterDelegate=
[self presentViewController:gameCenterController animated:YES completion:nil];
2.然后看一下排行榜控制器视图KCLeaderboardTableViewController:
在排行榜控制器视图中定义一个leaderboards属性用于接收主视图控制器传递的排行榜信息并且通过一个UITableView展示排行榜名称、得分等。
在排行榜控制器视图中通过GKScore的reportScores: withCompletionHandler:设置排行榜得分,注意每个GKScore对象必须设置value属性来表示得分(GKScore是通过identifier来和排行榜关联起来的)。
KCLeaderboardTableViewController.m
Created by Kenshin Cui on 14/4/5.
Copyright (c) 2015年 cmjstudio. All rights reserved.
8 #import "KCLeaderboardTableViewController.h"
10 //排行榜标识,就是iTunes Connect中配置的排行榜ID
11 #define kLeaderboardIdentifier1 @"Goals"
12 @interface KCLeaderboardTableViewController ()
14 @implementation KCLeaderboardTableViewController
15 - (void)viewDidLoad {
[super viewDidLoad];
18 #pragma mark - UI事件
19 //添加得分(这里指的是进球数)
20 - (IBAction)addScoreClick:(UIBarButtonItem *)sender {
[self addScoreWithIdentifier:kLeaderboardIdentifier1 value:100];
23 #pragma mark - UITableView数据源方法
24 -(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{
27 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.leaderboards.
30 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identtityKey=@"myTableViewCellIdentityKey1";
UITableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:identtityKey];
if(cell==nil){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identtityKey];
GKLeaderboard *leaderboard=self.leaderboards[indexPath.row];
GKScore *score=[leaderboard.scores firstObject];
NSLog(@"scores:%@",leaderboard.scores);
cell.textLabel.text=leaderboard.//排行榜标题
cell.detailTextLabel.text=[NSString stringWithFormat:@"%lld",score.value]; //排行榜得分
43 #pragma mark - 属性
44 #pragma mark - 私有方法
@param identifier 排行榜标识
@param value
51 -(void)addScoreWithIdentifier:(NSString *)identifier value:(int64_t)value{
if (![GKLocalPlayer localPlayer].isAuthenticated) {
NSLog(@"未获得用户授权.");
//创建积分对象
GKScore *score=[[GKScore alloc]initWithLeaderboardIdentifier:identifier];
//设置得分
score.value=
//提交积分到Game Center服务器端,注意保存是异步的,并且支持离线提交
[GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
if(error){
NSLog(@"保存积分过程中发生错误,错误信息:%@",error.localizedDescription);
NSLog(@"添加积分成功.");
3.最后就是成就视图控制器KCAchievementTableViewController:
在 成就视图控制器定义achievements、achievementDescriptions、achievementImages三个属性分别表示成 就、成就描述、成就图片,这三个属性均从主视图控制器中传递进来,然后使用UITableView展示成就、成就图片、成就进度。
创建 GKAchievemnt对象(通过identifier属性来表示具体的成就)并指定完成度,通过调用GKAchievement的 reportAchievements: withCompletionHandler:方法提交完成度到Game Center服务器。
KCAchievementTableViewController.m
Created by Kenshin Cui on 14/4/5.
Copyright (c) 2015年 cmjstudio. All rights reserved.
8 #import "KCAchievementTableViewController.h"
10 //成就标识,就是iTunes Connect中配置的成就ID
11 #define kAchievementIdentifier1 @"AdidasGoldenBall"
12 #define kAchievementIdentifier2 @"AdidasGoldBoot"
13 @interface KCAchievementTableViewController ()
15 @implementation KCAchievementTableViewController
16 #pragma mark - 控制器视图方法
17 - (void)viewDidLoad {
[super viewDidLoad];
21 #pragma mark - UI事件
22 //添加成就
23 - (IBAction)addAchievementClick:(UIBarButtonItem *)sender {
[self addAchievementWithIdentifier:kAchievementIdentifier1];
26 #pragma mark - UITableView数据源方法
27 -(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index{
30 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.achievementDescriptions.
33 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identtityKey=@"myTableViewCellIdentityKey1";
UITableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:identtityKey];
if(cell==nil){
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identtityKey];
GKAchievementDescription *desciption=[self.achievementDescriptions objectAtIndex:indexPath.row];
cell.textLabel.text=desciption.//成就标题
//如果已经获得成就则加载进度,否则为0
double percent=0.0;
GKAchievement *achievement=[self getAchievementWithIdentifier:desciption.identifier];
if (achievement) {
percent=achievement.percentC
cell.detailTextLabel.text=[NSString stringWithFormat:@"%3.2f%%",percent]; //成就完成度
//设置成就图片
cell.imageView.image=[self.achievementImages valueForKey:desciption.identifier];
52 #pragma mark - 私有方法
53 //添加指定类别的成就
54 -(void)addAchievementWithIdentifier:(NSString *)identifier{
if (![GKLocalPlayer localPlayer].isAuthenticated) {
NSLog(@"未获得用户授权.");
//创建成就
GKAchievement *achievement=[[GKAchievement alloc]initWithIdentifier:identifier];
achievement.percentComplete=100;//设置此成就完成度,100代表获得此成就
NSLog(@"%@",achievement);
//保存成就到Game Center服务器,注意保存是异步的,并且支持离线提交
[GKAchievement reportAchievements:@[achievement] withCompletionHandler:^(NSError *error) {
if(error){
NSLog(@"保存成就过程中发生错误,错误信息:%@",error.localizedDescription);
NSLog(@"添加成就成功.");
72 //根据标识获得已取得的成就
73 -(GKAchievement *)getAchievementWithIdentifier:(NSString *)identifier{
for (GKAchievement *achievement in self.achievements) {
if ([achievement.identifier isEqualToString:identifier]) {
运行效果:
注意:首次使用游戏时由于没有对Game Center授权,会提示用户登录Game Center。
阅读(...) 评论()
Write the code ,change the world!IOS平台游戏如何对接GameCenter
现在随着手游市场的不断扩大,活跃在IOS平台下的游戏厂商为了增加玩家的粘性,以及为自己的游戏前途考虑都纷纷开始接入苹果国内公司的游戏平台GameC今天呢我就把我对接GameCenter的一些心得以及操作分享给
现在随着手游市场的不断扩大,活跃在平台下的游戏厂商为了增加玩家的粘性,以及为自己的游戏前途考虑都纷纷开始接入苹果国内公司的游戏平台GameC今天呢我就把我对接GameCenter的一些心得以及操作分享给大家,内容很简单也希望在这方面有经验的也可以跟我分享一下。
1.itunesConnect配置:
打开ItunesConnect,选中你的应用,在自己的应用页面上面找到GameCenter选项,如图:
点击打开GameCenter显示如图效果:
apple GameCenter分为两块:“排行榜”与“成就”。首先我们先来添加排行榜:
添加成就:
每个应用的成就点数最多为1000点,属性Hidden(隐藏),如果将其设置为YES,则在用户获得成就或取得一定进展前,成就是不可见的。
如果要让用户能够接受基于已获得的成就的挑战,则需在iTunes Connect中创建成就时选中复选框“可多次获得”。
每个成就需要配置本地化描述;每个成就都有两个描述,一个在用户获得成就前显示,另一个在用户获得成就后显示。另外还需要给每个成就提供已付图像,尺寸为512X512,(应用发布后就不能删除其中的成就)
分别编辑完排行榜与成就后,最终在ItunesConnect中的效果:
对于开发者来说,GameCenter必须经过测试才能上线,没有上线的程序在测试环境中登录时会出现sandBox提示。
好了,itunesConnect部分的基本配置就介绍完了,是不是很简单。下面我们来讲一下程序部分~
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apple为大家接入GameCenter提供了GameKit.framework,在需要使用GameCenter的类中都要导入GameKit.h;在.h文件中加入协议“GKGameCenterControllerDelegate”.
1.游戏中心管理器
创建共享的游戏管理器,不仅可以将GameCenter功能放在独立的类中,还可以轻松的在新项目中添加GameCenter功能。
判断是否支持GameCenter:
//是否支持GameCenter
- (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);
2,身份验证
GameCenter是一种需要验证身份的服务,如果没有登录就得先验证身份,否则什么也做不了。
//身份验证
- (void)authenticateLocalUser{
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error){
if (viewController != nil) {
[self presentViewController:viewController animated:YES completion:nil];
if ([GKLocalPlayer localPlayer].authenticated) {
// Get the default leaderboard identifier.
[[GKLocalPlayer localPlayer] loadDefaultLeaderboardIdentifierWithCompletionHandler:^(NSString *leaderboardIdentifier, NSError *error) {
if (error != nil) {
NSLog(@"%@", [error localizedDescription]);
3.用户变更检测
//用户变更检测
- (void)registerFoeAuthenticationNotification{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(authenticationChanged) name:GKPlayerAuthenticationDidChangeNotificationName object:nil];
- (void)authenticationChanged{
if([GKLocalPlayer localPlayer].isAuthenticated){
4.提交得分
向GameCenter验证身份后,便可提交得分了。
创建GKStore对象:
- (void) reportScore: (int64_t) score forCategory: (NSString*) category{
GKScore *scoreReporter = [[GKScore alloc] initWithCategory:category];
scoreReporter.value =
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
if(error != nil){
NSData *saveSocreData = [NSKeyedArchiver archivedDataWithRootObject:scoreReporter];
//未能提交得分,需要保存下来后继续提交
[self storeScoreForLater:saveSocreData];
NSLog(@"提交成功");
- (void)storeScoreForLater:(NSData *)scoreData{
NSMutableArray *savedScoresArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedScores"]];
[savedScoresArray addObject:scoreData];
[[NSUserDefaults standardUserDefaults] setObject:savedScoresArray forKey:@"savedScores"];
若得分提交不成功,需要再重新提交得分:
//重新提交分数
- (void)submitAllSavedScores{
NSMutableArray *savedScoreArray = [[NSMutableArray alloc] initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedScores"]];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"savedScores"];
for(NSData *scoreData in savedScoreArray){
GKScore *scoreReporter = [NSKeyedUnarchiver unarchiveObjectWithData:scoreData];
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
if(error != nil){
NSData *saveSocreData = [NSKeyedArchiver archivedDataWithRootObject:scoreReporter];
//未能提交得分,需要保存下来后继续提交
[self storeScoreForLater:saveSocreData];
NSLog(@"提交成功");
5.显示排行榜
创建GKLocalboardViewController来显示排行榜.
- (void)showGameCenter{
GKGameCenterViewController *gameView = [[GKGameCenterViewController alloc] init];
if(gameView != nil){
gameView.gameCenterDelegate =
[gameView setLeaderboardCategory:@"com.xxxx.test"];
[gameView setLeaderboardTimeScope:GKLeaderboardTimeScopeAllTime];
[self presentViewController:gameView animated:YES completion:^{
- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController{
[self dismissViewControllerAnimated:YES completion:nil];
6.得分成就
挑战让用户可以通过GameCenter向玩家发起得分或成就方面的挑战。挑战分为四种:“无效”,“待处理”,“已结束”,“已谢绝”。
- (void)reportAchievment:(NSString *)identifier withPercentageComplete:(double)percentComplete{
GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier:identifier];
[achievement setPercentComplete:percentComplete];
[achievement reportAchievementWithCompletionHandler:^(NSError *error) {
if(error != nil){
NSLog(@"error:%@", [error localizedDescription]);
NSLog(@"提交成就成功");
示例演示:
1.在sandbox环境中登录GameCenter
登录成功以后会在上方显示一个横幅“Welcome....”,点击GameCenter app就会显示您以及您游戏的相关信息.
3.排行榜界面
成就的图标为在后台配置的图标;
5.添加好友
点击右上角的“加号”按钮,会弹出一个添加好友的界面,输入对方AppleID即可给对方发送好友请求。
6.发起挑战
对方收到挑战信息推送界面
好了,gameCenter的接入到这边就告一段落了,若在开发中有新的发现我会及时跟新这篇文章,欢迎大家评论分享自己的看法。

我要回帖

更多关于 rootviewcontroller 的文章

 

随机推荐