cocos2d-x 接入 GameCenter 排行榜与成就

前言

要求接入GameCenter的排行榜和成就。

GameCenter 是苹果推出的一个社交平台,
它主要提供了以下几个功能:

  • 排行榜
  • 成就
  • 挑战

而且,苹果同时提供了GameKit框架来让GameCenter更易集成。

可能是因为GameCenter的热度过去了吧,相关的东西都比较早期。
整理总结了一下,希望对他人有所帮助。

我的环境:

mac - XCode 8.3 - cocos2d-x lua






公共的处理

1. 配置 iTunes Connect 排行榜与成就的位置。

登录iTunes Connect,找到要处理的APP。
选择 功能->GameCenter
可以看到三个大项:
- 移动群组
- 排行榜
- 成就


2. 添加GameKit框架

打开项目工程,将 Capabilities 的 GameCenter 打开。
这样,XCode就会将GameKit框架加到我们的工程中。


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。
cocos2d-x其实已经有相关的调用结构 —— LuaObjcBridge,可以直接用 callStaticMethod来调用:

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 找到 排行榜。

简单说一下流程吧:
配置排行榜的结构,然后我们在游戏中将数据上传到这个结构,最后显示到GameCenter中。

排行榜分为 单个排行榜 与 组合排行榜。(顾名思义,区别就不需要解释了吧?)
里面需要配置的相应属性,可参考本文末尾的关于。

要注意两点:

  1. 排行榜ID,因为只有它是在创建后无法更改的。(而且,要记住这个ID,因为后面程序要用到)
  2. 排行榜只要发布了(经过审批发布),就无法删除了。

接下来就看属性去配置它吧。




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];
        }];
    }
  • 给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 = 分数值})






关于成就

配置 iTunes Connect

还是老位置,之前看的排行榜,这次点成就。
还是老样子,成就的ID,创建后不可修改,成就发布后不可删除。
但是,成就还要多一点,就是每个游戏总共有2000点成就分(为什么是2000?你问老乔去。。),你可以给每个成就分配一些成就分。
成就还有是否隐藏的选项,但是它的隐藏并不是看不到这个成就了,而是有一个成就名称为隐藏的成就显示在列表中。
还有,它的进度是一个顺时针扇形来表示,就是你的图标刚开始是被遮掩的,随着进度的增加,会逐渐显现出图标,方向是顺时针扇形。

其他相关参数,可参考本文末尾的关于。




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 --  提交成就成功");  
            }  
        }];  
    }
  • 给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,别踩白块 那些游戏来弄。
或许,这也是这个平台没落了的原因吧。






关于






参考

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是