
要求接入GameCenter的排行榜和成就。
GameCenter 是苹果推出的一个社交平台,
它主要提供了以下几个功能:
而且,苹果同时提供了GameKit框架来让GameCenter更易集成。
可能是因为GameCenter的热度过去了吧,相关的东西都比较早期。
整理总结了一下,希望对他人有所帮助。
我的环境:
mac - XCode 8.3 - cocos2d-x lua
登录iTunes Connect,找到要处理的APP。
选择 功能->GameCenter
可以看到三个大项:
- 移动群组
- 排行榜
- 成就
打开项目工程,将 CapabilitIEs 的 GameCenter 打开。
这样,XCode就会将GameKit框架加到我们的工程中。
登录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) { // 没有用户,d出登录界面 [self presentVIEwController:vIEwController]; } else { // 没有用户,并且没有登录界面 _gameCenterFeaturesEnabled = NO; } }; } 因为我的环境是 cocos2d-x lua,所以,用通过lua来调用object-c。
cocos2d-x其实已经有相关的调用结构 —— LuaObjcBrIDge,可以直接用 callStaticmethod来调用:
LuaObjcBrIDge.callStaticmethod(methodname classname,args)
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 由你决定,可以放在 AppDelegate 中 applicationDIDFinishLaunching时。
在iTunes Connect 找到 排行榜。
简单说一下流程吧:
配置排行榜的结构,然后我们在游戏中将数据上传到这个结构,最后显示到GameCenter中。
排行榜分为 单个排行榜 与 组合排行榜。(顾名思义,区别就不需要解释了吧?)
里面需要配置的相应属性,可参考本文末尾的关于。
要注意两点:
排行榜ID,因为只有它是在创建后无法更改的。(而且,要记住这个ID,因为后面程序要用到) 排行榜只要发布了(经过审批发布),就无法删除了。接下来就看属性去配置它吧。
模拟这个流程:登录GameCenter -> 提交排行榜数据 ( -> 如果需要,d出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]; }]; } 给lua调用的函数 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]; } lua调用
LuaObjcBrIDge.callStaticmethod("GameKitHelper","getscore",{ID = 排行榜的ID,score = 分数值})
还是老位置,之前看的排行榜,这次点成就。
还是老样子,成就的ID,创建后不可修改,成就发布后不可删除。
但是,成就还要多一点,就是每个游戏总共有2000点成就分(为什么是2000?你问老乔去。。),你可以给每个成就分配一些成就分。
成就还有是否隐藏的选项,但是它的隐藏并不是看不到这个成就了,而是有一个成就名称为隐藏的成就显示在列表中。
还有,它的进度是一个顺时针扇形来表示,就是你的图标刚开始是被遮掩的,随着进度的增加,会逐渐显现出图标,方向是顺时针扇形。
其他相关参数,可参考本文末尾的关于。
流程与排行榜的一样,但是这次提交的不是分数了,而是成就完成的百分比。
// 提交成就数据 -(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 -- 提交成就成功"); } }]; } 给lua调用的函数 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]; } lua调用
LuaObjcBrIDge.callStaticmethod("GameKitHelper","getAchIEvement",{ID = 成就ID,percent = 成就百分比})
GameCenter还是挺好的一个东西。
它还有一个好友挑战功能,但这个主要适合之前 Flappy Bird,别踩白块 那些游戏来弄。
或许,这也是这个平台没落了的原因吧。
以上是内存溢出为你收集整理的cocos2d-x 接入 GameCenter 排行榜与成就全部内容,希望文章能够帮你解决cocos2d-x 接入 GameCenter 排行榜与成就所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)