iOS 6 Game Center之新功能第1部分
来源:互联网 发布:淘宝如何权重 编辑:程序博客网 时间:2024/05/30 21:58
原文地址:点击打开链接
来自Ray: 这是iOS 6 盛宴的第7部分!本篇教程是我们的最新教程大作iOS 6 By Tutorials的中相应篇章的简略版。Ali Hafizji是本篇教程的作者,他以前在本网站还发表过几篇Android的教程。Enjoy!
本篇教程由iOS教程组成员Ali Hafizji发表,他是一名iOS和Android开发者,目前在Tavisca Solutions工作。
你也许曾听说过Game Center,它是自打iOS 4.1被引入的在线多人社交游戏网络,支持玩家邀请好友一起玩儿游戏,还可以建立一个多人游戏的会话,追踪成就系统,以及其他功能。
除了可以让开发者更轻松的实现一些基本功能外,它还改善了另一个基础问题:app推广。如今App Store上有超过1百万款app,单个用户发现你的app的概率将会非常低。Game Center通过好友系统改善了此类问题,你可以查看你的好友都在玩儿些什么游戏,因此你的游戏的曝光率被增加了。
iOS 6.0为Game Center引入了一系列新的API,它们不仅可以增加你的游戏曝光率,而且还能增加用户粘性。其中一项功能是挑战好友,即使你的Gamecenter好友们没有安装此游戏,也可以邀请向他们发送挑战。例如,一个玩家在你的游戏里得到了高分,他可以向他的朋友发送一个挑战邀请并且说:“嘿,来试试赢我啊!”
当朋友接收到挑战后,会立即看到消息中你的游戏的链接。不难想象这一特性能够成倍的增加用户留存率!由于考虑到Game Center上庞大的用户群体,这一点足够说明你应该在游戏中添加挑战功能。
使用挑战之前要先使用Game Center,所以本篇教程将首先带你整体过一遍Game Center,包括设置Game Center并添加一个简单的排行榜,同时会在过程中指出iOS 6新增的内容。
注意: 本篇教程要求你熟悉Cocos2D并且基于它制作过游戏。如果你是Cocos2D的新手,可以先在本网站学习Cocos2D系列教程。
跳跃猴游戏
首先下载初始工程 – 跳跃猴!
MonkeyJump(跳跃猴)是一个简单的横向卷轴游戏,它由我最喜欢的游戏引擎Cocos2D制作的。它是基于一个由Cocos2D学习工作室制作的叫做CatJump的游戏。我向其中加了一些有趣的元素,另外Vicki Wenderlich为游戏制作了新的美术资源。
游戏中的主要角色很明显,是一只猴子,游戏的主要目标让猴子达到最远的距离同时躲避敌人。
MonkeyJump非常容易上手,即使是你的妈妈也能玩儿!只需要轻点屏幕就可以让猴子跳过敌人了。游戏会记录猴子跑的距离并以此为玩家打分。
亲自是玩儿一下吧!把starter项目解压,在Xcode中编译并运行。试试看你能跑多远!:]
另外简单过一遍代码,看看这些层和场景之间是如何协调工作的。
配置Game Center
在做任何有关Game Center Challenges功能之前,首先要做的就是配置你的app使用Game Center!这个过程需要三个步骤:
- 创建并设置App ID。
- 在iTunes Coonect上注册你的app。
- 启用Game Center的功能,比如leaderboards(排行榜)
让我们按顺序过一遍这些步骤。对于许多有Game Center经验的读者来说,这会是相当熟悉的,但我保证我会很快的讲完这一部分。
创建并设置App ID
第一步,你需要创建一个App ID。登录到iOS Dev Center,选择iOS Provisioning Portal。
在Provisioning Portal中,选择App IDs,选择create a new App ID。使用monkeyjump作为游戏名字并输入一个bundle identifier,通常这里使用倒转的DNS命名,比如com.ali.MonkeyJump(如果你没有自己的域名,你可以使用你自己的名字代替)。
当你完成后,点击Submit按钮。打开MonkeyJump Xcode工程,选择project root,然后选择MonkeyJump target,在Summary tab中把Bundle Identifier替换为你刚刚在Provisioning Portal中创建的那个。
编译并运行,在真机上运行试试看。如果一切配置都正确的话,游戏应该立刻启动。如果没有,那么clean一下项目并重新编译一次。
在iTunes Connect中注册你的app
接下来的步骤是iTunes Connect中创建一个新app。首先登录到iTunes Connect,切换到application management子页面,点击位于左上角的Add New App按钮。(如果你同时拥有Mac和iOS的开发者帐号,你可能需要选择app的类型 – 当然要选择iOS)。
在第一个屏幕中,输入MonkeyJump作为游戏名字,400作为SKU number(SKU number可以是任意的数字/单词,你也可以设置成你想要的)并选择上一步中创建的Bundle Identifier。
当你输入完所有值后,点击Continue。在弹出的提示框中输入所有需要的信息。因为你只需要在本教程中使用此项目,所以一切从简,只填入强制要求填入的项目。☺
你需要上传一个大的app icon 和一个截图。为了让过程更容易,我为你准备好了iTunes resources file。你可以解压这个ZIP文件,使用里边的图片来很快的完成这个烦人的注册过程。
当你完成后,点击Save按钮,如果一切都OK的话,你会得到以下提示:
欢呼!你已经在iTunes Connect中注册了你的app并完成了最敷衍了事的部分,哈哈。接下来还需要几个小步骤来激活Game Center。不要慌张,因为最麻烦的部分已经过去了。☺
启用Game Center的功能
点击蓝色的Manage Game Center按钮并点击Enable for Single Game Button。太棒了!你已经为你的游戏启用了Game Center了。这个步骤简单到只需要点击按钮 – 不过别高兴的太早,之后你还是需要写很多的代码才行哦。:]
你还没有完成本部分,还要添加一个leaderboard(排行榜)才算完。你可能会问这篇教程不是讲challenges的吗,跟leaderboard有什么关系呢,别急,稍后你就明白了!
使用challenge要求添加一个leaderboard。点击Add Leaderboard按钮并选择Single Leaderboard类型。之后你会看到一个如下的表格:
在leaderboard reference name栏输入High Scores,leaderboard ID栏输入HighScores。
注意: 一般来说,我推荐你使用包名字的扩展作为leaderboard或者achievement(成就)的ID。例如,以上的名字就是com.ali.MonkeyJump.HighScores(你需要把com.ali替换为你自己的)。但是为了本篇教学的简化,直接把它命名为HighScores(而不是加上域名的前缀)。
把Sort Order设置为High to Low,Score Format Type设置为Integer。最后,点击Add Language按钮。为language details添入以下内容:
此处添加图片不是虽然强制的,但是添加它是个很好的实践机会。这里你需要使用的资源是iTunes resource文件夹中名字为icon_leaderboard_512.png,把它用作高分排行榜的icon。当你完成后,点击Save。
最后,点击Done按钮。到这里,一个leaderboard的配置就完成了,以后如果你想添加更多的,你就可以随心所欲了。
验证本地玩家
在你开始写代码之前,你需要首先import(导入)GameKit framework。在 Xcode 4.5 中打开MonkeyJump工程并进入target设置。打开Build Phases子页面,选择Link Binary With Libraries部分。点击 “+” 按钮,选择导入GameKit framework到工程中。
接下来你需要写一些代码来验证用户。注意如果你不验证用户,你是不能够使用任何Game Center提供的很棒的功能的。
这里的Player代表当前正在玩儿你的游戏玩家。在Game Center的术语里,这由GKLocalPlayer表示。
验证过程简单的分为两个步骤:
- 首先你调用一个authenticate call 到 Game Center平台。
- 平台会异步的处理你的请求,结束后会调用一个回调函数。如果玩家已经登录了(95%的情况),一个欢迎的横幅会弹出来,如果玩家没登录,那么一个允许玩家注册的登录界面会弹出来。
我们这就写些代码。这里我们使用一个单例模式,也就是说所有的Game Center的代码都在一个类中。
在Xcode中,右键点击MonkeyJump group,选择New Group。把新group命名为GameKitFiles。然后,右键点击新创建的这个group并选择New File…,文件模版选择Objective-C Class template。把文件命名为GameKitHelper,同时继承NSObject。
把GameKitHelper.h中的内容替换为以下内容:
// Include the GameKit framework#import <GameKit/GameKit.h> // Protocol to notify external// objects when Game Center events occur or// when Game Center async tasks are completed@protocol GameKitHelperProtocol<NSObject>@end @interface GameKitHelper : NSObject @property (nonatomic, assign) id<GameKitHelperProtocol> delegate; // This property holds the last known error// that occured while using the Game Center API's@property (nonatomic, readonly) NSError* lastError; + (id) sharedGameKitHelper; // Player authentication, info-(void) authenticateLocalPlayer;@end
以上代码自说明性很强并且有很详细的注释。你在此所做的无非就是声明两个方法和两个属性,其中一个属性是delegate,另外一个会记录下最近一次使用GameKit framework报出的错误。
切换到GameKitHelper.m并把文件替换为以下内容:
#import "GameKitHelper.h"#import "GameConstants.h" @interface GameKitHelper () <GKGameCenterControllerDelegate> { BOOL _gameCenterFeaturesEnabled;}@end @implementation GameKitHelper #pragma mark Singleton stuff +(id) sharedGameKitHelper { static GameKitHelper *sharedGameKitHelper; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedGameKitHelper = [[GameKitHelper alloc] init]; }); return sharedGameKitHelper;} #pragma mark Player Authentication -(void) authenticateLocalPlayer { GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer]; localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) { [self setLastError:error]; if ([CCDirector sharedDirector].isPaused) [[CCDirector sharedDirector] resume]; if (localPlayer.authenticated) { _gameCenterFeaturesEnabled = YES; } else if(viewController) { [[CCDirector sharedDirector] pause]; [self presentViewController:viewController]; } else { _gameCenterFeaturesEnabled = NO; } };}@end
这里你声明了一个名为_gameCenterFeaturesEnabled的变量。这个BOOL类型的变量会标识验证是否成功。
iOS 6.0中验证玩家的方式有所改变。所有你需要的就是设置GKLocalPlayer对象的authenticationHandler属性,正如你在authenticateLocalPlayer方法中看到的。authenticationHandler block有两个参数,它是被Game Center平台自动调用的。
这个block被系统在以下情形中被调用:
- 当你设置了authenticationHandler并发出了验证玩家的请求。
- 当app进入foreground(前台)。
- 在登录时,例如玩家在进入游戏前没有登录,进入时会弹出登录界面,在这个界面中的任何交互都会调用authenticationHandler。
authenticationHandler有两个参数:
- 第一个是 UIViewController ,它代表如果你未登录Game Center,需要你弹出的登录view controller。
- 还有一个 NSError 表示验证过程中发生的任何错误。
值得注意的是,在这个block中,你首先检查玩家是否验证过了,如果玩家已经被验证了,你需要做的就是把_gameCenterEnabled变量置为true,然后就可以继续游戏了。
如果login view controller(authenticationHandler block中的第一个参数)不为nil,就意味着玩家还没有登录Game Center。如果是这种情况,你先暂停游戏,然后为玩家弹出登录的view controller。如果玩家在此界面登录成功或者点击Cancel按钮,以上那个handler block还会被调用一次。
在老版本的Game Center中,开发者是没法决定何时为玩家弹出登录界面的。这个新方法给予了开发者更多可控性,来决定在何时弹出此界面。
最终,如果验证失败了,你需要恰当的禁用所有Game Center的功能。这里通过把_gameCenterFeaturesEnabled变量置为false来让app无视Game Center的功能调用。
为了让authenticateLocalPlayer起作用,你还需要一些代码。在GameKitHelper.m中加入以下内容:
#pragma mark Property setters -(void) setLastError:(NSError*)error { _lastError = [error copy]; if (_lastError) { NSLog(@"GameKitHelper ERROR: %@", [[_lastError userInfo] description]); }} #pragma mark UIViewController stuff -(UIViewController*) getRootViewController { return [UIApplication sharedApplication].keyWindow.rootViewController;} -(void)presentViewController:(UIViewController*)vc { UIViewController* rootVC = [self getRootViewController]; [rootVC presentViewController:vc animated:YES completion:nil];}
以上代码实现了authenticateLocalPlayer需要的三个函数:
- lastError属性被声明为readonly。因此你不能在直接设置它的值,需要手动为其添加一个setter方法。这就是setLastError:的作用。
- Game Center登录controller需要真实显示出来,这样玩家才能做登录操作。presentViewController: 和 getRootViewController方法负责得到root view controller并且通过root view controller把登录界面显示出来。
太棒了!现在是时候测试一下GameKitHelper了。打开Prefix.pch并加入必要的import:
#import "GameKitHelper.h"
接下来,打开MenuLayer.m并在onEnter(紧跟在[super onEnter]语句之后)中加入如下内容。每当主界面显示的时候都会验证玩家。
[[GameKitHelper sharedGameKitHelper] authenticateLocalPlayer];
编译并运行。当主菜单显示出来的时候你会看到以下的内容:
左边的图示演示了登录view controller(玩家未登录Game Center的情况)。右边的演示了welcome banner,每当验证成功时就会弹出。
注意: 为了测试验证过程,首先登出Game Center然后再在MonkeyJump app里登录。只有这样才能在沙盒模式下运行Game Center。另外,在模拟器上运行也许行不通(至少在写这篇教程时还不行)。你需要在真机上进行测试。
提交分数到Game Center
若提交一个分数到Game Center,需要使用GKScore类。这个类保存着有关玩家分数和分数所属类别的信息。
类别指的是leaderboard ID。例如,你希望提交一个分数到High Scores排行榜,那么GKScore对象的category就应该是你在iTues Connect设置的那个leaderboard ID,这里就是HighScores。
打开GameKitHelper.h并加入以下方法声明:
// Scores-(void) submitScore:(int64_t)score category:(NSString*)category;
接下来,在GameKitHelperProtocol中加入以下方法声明:
-(void) onScoresSubmitted:(bool)success;
打开GameKitHelper.m并加入以下代码:
-(void) submitScore:(int64_t)score category:(NSString*)category { //1: Check if Game Center // features are enabled if (!_gameCenterFeaturesEnabled) { CCLOG(@"Player not authenticated"); return; } //2: Create a GKScore object GKScore* gkScore = [[GKScore alloc] initWithCategory:category]; //3: Set the score value gkScore.value = score; //4: Send the score to Game Center [gkScore reportScoreWithCompletionHandler: ^(NSError* error) { [self setLastError:error]; BOOL success = (error == nil); if ([_delegate respondsToSelector: @selector(onScoresSubmitted:)]) { [_delegate onScoresSubmitted:success]; } }];}
以下是上面方法的分步说明:
- 检查Game Center功能是否启用了,只有当启用时再执行之后的代码。
- 创建一个GKScore的实例。GKScore所需要的分数所属类别作为init方法的参数传入。
- 设置GKScore的分数值。
- 使用reportScoreWithCompletionHandler:方法把GKScore对象发送到Game Center端。当分数被发送后,平台会调用completion handler。completion handler是一个只有一个参数的block,在这里是一个NSError 对象,你可以通过它来查看分数是否发送成功了。
现在你已经有了发送分数到Game Center的方法了,是时候使用它了。在使用该方法之前,打开GameConstants.h并在文件末尾(但在最后的#endif之前)加入以下define语句:
#define kHighScoreLeaderboardCategory @"HighScores"
然后,打开GameLayer.m并找到monkeyDead方法。根据此方法的名字透露的信息,这个方法是在猴子挂掉时调用的。换句话说,就是游戏结束的时候。
在该方法的开头加入以下语句:
[[GameKitHelper sharedGameKitHelper] submitScore:(int64_t)_distance category:kHighScoreLeaderboardCategory];
编译并运行。玩儿一遍游戏直到猴子挂掉。可怜的小家伙!
当你玩儿完后,你的分数会被发送到Game Center。为了验证是否真的发送成功了,打开Game Center app,点击Games分页并选择MonkeyJump。这里的排行榜会显示你的分数。下边是HighScores排行榜的截图示例:
你打败我的分数了吗?不要使用改代码的作弊手段哦!:]
- iOS 6 Game Center之新功能第1部分
- iOS 6 Game Center之新功能第2部分
- iOS游戏开发之Game Center研究
- iOS游戏开发之Game Center研究
- ios Game-Center 开发 part1
- ios Game-Center 开发 part2
- 通过 Health Center API 监视 Java 应用程序,第 1 部分
- Java SE 6 新特性系列 第 1 部分,Instrumentation 新功能
- Java Math 类中的新功能,第 1 部分:实数
- Java Math 类中的新功能,第 1 部分: 实数
- Java Math 类中的新功能,第 1 部分: 实数
- 教程:Corona集成Game Center(iOS)
- iOS - 集成game center (leader board)
- iOS Game Center 登陆验证实现
- iOS部分-UI基础控件 - 01天 入门 第10课 frame&bounds¢er属性
- Game Center
- App ID & Game Center - II (代码部分)
- IBM Mashup Center 应用程序实例,第 1 部分:缺陷跟踪和管理
- Flex4.6 + WebService(C#) + SQLServer2005+DataGrid增删查改程序
- oracle操作笔记
- poj2728-最小比率生成树/0-1分数规划/二分/迭代
- 光线追踪(RayTracing)算法理论与实践(一)入门
- 自动生成的 菜单程序,一会分析一下
- iOS 6 Game Center之新功能第1部分
- android安装时遇到的问题
- Openfiler 配置 NFS 示例
- “.rodata.str1.4”的连接(link)问题
- iOS 6 Game Center之新功能第2部分
- Oracle数据库中保存文件(C#)
- Qt creator 问题 during startup program exited with code 0x0的折中解决
- 高手博客列表
- CKEDITOR 中<p>标签引发的问题