cocos2d-x 接入 GameCenter 排行榜与成就
前言要求接入GameCenter的排行榜和成就。 GameCenter 是苹果推出的一个社交平台,
而且,苹果同时提供了GameKit框架来让GameCenter更易集成。 可能是因为GameCenter的热度过去了吧,相关的东西都比较早期。 我的环境: mac - XCode 8.3 - cocos2d-x lua
公共的处理1. 配置 iTunes Connect 排行榜与成就的位置。登录iTunes Connect,找到要处理的APP。 2. 添加GameKit框架打开项目工程,将 Capabilities 的 GameCenter 打开。 3. 登录GameCenter登录GameCenter: 【这个步骤在我们加载完游戏时进行即可】 -(void) authenticateLocalPlayer { // 获取本地用户 GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer]; // 认证登录 localPlayer.authenticateHandler = ^(UIViewController *viewController,NSError *error) { [self setLastError:error]; if (localPlayer.authenticated) { // 本地用户已经登录 _gameCenterFeaturesEnabled = YES; // 此变量是判断是否已经登录上GameCenter } else if(viewController) { // 没有用户,弹出登录界面 [self presentViewController:viewController]; } else { // 没有用户,并且没有登录界面 _gameCenterFeaturesEnabled = NO; } }; } 4. 关于lua调用object-c因为我的环境是 cocos2d-x lua,所以,用通过lua来调用object-c。 LuaObjcBridge.callStaticMethod(methodName className,args) 5. GameKit辅助处理类GameKitHelper.h: #import <GameKit/GameKit.h> #import "cocos2d.h" // 方便lua调用 #include "CCLuaEngine.h" #include "CCLuaBridge.h" @interface GameKitHelper : NSObject // 处理错误 @property (nonatomic,readonly) NSError* lastError; // 初始化 + (id) sharedGameKitHelper; // Player authentication,info -(void) authenticateLocalPlayer; @end GameKitHelper.mm #import "GameKitHelper.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 (localPlayer.authenticated) { _gameCenterFeaturesEnabled = YES; } else if(viewController) { [self presentViewController:viewController]; } else { _gameCenterFeaturesEnabled = NO; } }; } #pragma mark Property setters -(void) setLastError:(NSError*)error { _lastError = [error copy]; if (_lastError) { NSLog(@"GameCenter -- setLastError -- 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]; } @end 6. 登录GameCenter时机由你决定,可以放在 AppDelegate 中 applicationDidFinishLaunching时。
关于排行榜配置 iTunes Connect在iTunes Connect 找到 排行榜。 简单说一下流程吧: 排行榜分为 单个排行榜 与 组合排行榜。(顾名思义,区别就不需要解释了吧?) 要注意两点:
接下来就看属性去配置它吧。
XCode工程配置模拟这个流程:登录GameCenter -> 提交排行榜数据 ( -> 如果需要,弹出GameCenter排行榜) 提交排行榜数据: -(void) submitScore:(int64_t)score category:(NSString*)category { // 这里两个参数 score是数据, category是ID,就是我们创建排行榜以后,不可更改的那个ID。 // 检查是否在登录状态 if (!_gameCenterFeaturesEnabled) { NSLog(@"GameCenter -- submitScore -- Player not authenticated"); return; } // 创建一个分数对象 GKScore* gkScore = [[GKScore alloc] initWithCategory:category]; // 设置分数对象的值 gkScore.value = score; // 向GameCenter提交数据 [gkScore reportScoreWithCompletionHandler: ^(NSError* error) { [self setLastError:error]; }]; }
实践使用在公用部分,已经添加了GameCenter的登录验证相关的东西了。
GameKitHelper.h -(void) submitScore:(int64_t)score category:(NSString*)category; GameKitHelper.mm -(void) submitScore:(int64_t)score category:(NSString*)category { if (!_gameCenterFeaturesEnabled) { NSLog(@"GameCenter -- submitScore -- Player not authenticated"); return; } GKScore* gkScore = [[GKScore alloc] initWithCategory:category]; gkScore.value = score; [gkScore reportScoreWithCompletionHandler: ^(NSError* error) { [self setLastError:error]; }]; }
GameKitHelper.h +(void) getScore:(NSDictionary *)dict; GameKitHelper.mm +(void) getScore:(NSDictionary *)dict { NSString* rID = [dict objectForKey:@"id"]; int score = [[dict objectForKey:@"score"] intValue]; [[GameKitHelper sharedGameKitHelper] submitScore:(int64_t)score category:rID]; }
关于成就配置 iTunes Connect还是老位置,之前看的排行榜,这次点成就。 其他相关参数,可参考本文末尾的关于。
XCode工程配置流程与排行榜的一样,但是这次提交的不是分数了,而是成就完成的百分比。 // 提交成就数据 -(void) submitAchievment:(NSString *)identifier percent:(double) percentComplete { // identifier 成就ID,percentComplete: 成就完成百分比 // 判断登录认证 if (!_gameCenterFeaturesEnabled) { NSLog(@"GameCenter -- submitAchievment -- Player not authenticated"); return; } // 创建成就结构,注入成就ID GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier:identifier]; // 设置成就百分比 [achievement setPercentComplete:percentComplete]; // 提交成就数据 [achievement reportAchievementWithCompletionHandler:^(NSError *error) { if(error != nil){ NSLog(@"GameCenter -- submitAchievment -- error:%@",[error localizedDescription]); }else{ NSLog(@"GameCenter -- submitAchievment -- 提交成就成功"); } }]; }
实践使用同排行榜一样。
GameKitHelper.h - (void)submitAchievment:(NSString *)identifier percent:(double)percentComplete; GameKitHelper.mm -(void) submitAchievment:(NSString *)identifier percent:(double) percentComplete { if (!_gameCenterFeaturesEnabled) { NSLog(@"GameCenter -- submitAchievment -- Player not authenticated"); return; } GKAchievement *achievement = [[GKAchievement alloc] initWithIdentifier:identifier]; [achievement setPercentComplete:percentComplete]; [achievement reportAchievementWithCompletionHandler:^(NSError *error) { if(error != nil){ NSLog(@"GameCenter -- submitAchievment -- error:%@",[error localizedDescription]); }else{ NSLog(@"GameCenter -- submitAchievment -- 提交成就成功"); } }]; }
GameKitHelper.h +(void) getAchievement:(NSDictionary *)dict; GameKitHelper.mm +(void) getAchievement:(NSDictionary *)dict { NSString* aID = [dict objectForKey:@"id"]; double percent = [[dict objectForKey:@"percent"] doubleValue]; [[GameKitHelper sharedGameKitHelper] submitAchievment:(NSString *)aID percent:percent]; }
最后GameCenter还是挺好的一个东西。
关于
参考
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |