いぬでもわかる

iOSやCocos2dxが好きでときどきAndroid。できるだけ毎日何かしら書く事を目標に頑張る。

cocos2d-x 3.0でのiOSアプリに対するGameCenterの実装その2

前回の記事では、cocos2d-xでiOSアプリにGameCenterを実装する前準備まで説明してきました。今回は、GameCenterを利用するための、Xcode上での実際のコーディングについて説明していきます。

GameCenter機能は、iOSネイティブで提供されている機能のため勿論Objective-Cで記載されています。そのため、cocos2d-xのc++のコードからobjective-cのコードを呼び出さなくてはなりません。ただし、勿論c++のコードからobjective-cの記法で書かれたヘッダファイルの読み込みはできません。そこで、c++objective-cの橋渡しをしてくれるのが、objective-c++です。objective-c++は、そういった新しい言語ではなく、objective-cc++のコードを混在させたコードの事をさします。c++の記法で書かれたヘッダで定義されたメソッド内で、objective-cのコードを書く事でc++objective-cの混在を可能にしています。

用意すべきコードは2つあり、1つはGameCenterの機能を呼び出すObjective-cで書かれたコード、もう1つがそのObjective-cで書かれたコードを呼び出すObjective-c++のコードです。Objective-cで書かれたコードは、GameCenterObjC、Objective-c++のコードはGameCenterBrideというファイル名で用意しました。

GameCenterObjC.m
Objective-Cでアプリを作っていたかたなら何も問題ない内容だと思いますが、GameCenterObjCでは、ネイティブのAPIを呼び出しGameCenterへのログインなどをするメソッドの実装を行っています。下記のコードは、GameCenterへのログインをするためのメソッドになります。ログインメソッドだけではなく、必要に応じてリーダーボードの表示や、リーダーボードへの得点の投稿メソッドなどの実装を行います。コードの全文はgithubで確認してみてください。

@implementation GameCenterObjC

+(void) loginGameCenter{
    if(floor(NSFoundationVersionNumber) >= NSFoundationVersionNumber_iOS_6_0){
        GKLocalPlayer* player = [GKLocalPlayer localPlayer];
        UIViewController* rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
        player.authenticateHandler = ^(UIViewController* ui, NSError* error )
        {
            if( nil != ui )
            {
                NSLog(@"Need to login");
                [rootController presentViewController:ui animated:YES completion:nil];
            }
            else if( player.isAuthenticated )
            {
                NSLog(@"Authenticated");
            }
            else
            {
                NSLog(@"Failed");
            }
        };
    }
    else{
        //6未満でのgamecenter認証コード
        GKLocalPlayer* localPlayer = [GKLocalPlayer localPlayer];
        
        [localPlayer authenticateWithCompletionHandler:^(NSError *error) {
            if(localPlayer.authenticated){
                NSLog(@"Authenticated");
            }
            else{
                NSLog(@"Not authenticated");
            }
        }];

    }
}

GameCenterBridge.h
Objeciteve-cとc++の記法を含んだObjective-c++のヘッダファイルです。c++で書かれたcocos2d-xのコードからinculudeできるようにObjective-cの文法は含まれていません。今回は、ログイン、リーダーボードの表示、スコアの送信の3つの機能を提供するためGameCenterBridgeでも同様の3つの機能を定義します。

class GameCenterBridge{
public:
    static void loginGameCenter();
    static void openRanking();
    static void postHighScore(int kind, int score);
};

GameCenterBridge.mm
Objeciteve-cとc++の記法を含んだObjective-c++の実装ファイルです。先ほど作成したGameCenterObjCをインクルードし、対応するメソッドでGameCenterObjCのメソッドを呼び出しています。

#include "GameCenterBridge.h"
#include "GameCenterObjC.h"

void GameCenterBridge::loginGameCenter(){
    [GameCenterObjC loginGameCenter];
}

void GameCenterBridge::postHighScore(int kind, int score){
    [GameCenterObjC postHighScore:[NSNumber numberWithInt:kind] score:[NSNumber numberWithInt:score]];
}

void GameCenterBridge::openRanking(){
    [GameCenterObjC openRanking];
}


cocos2d-xのコードからは、アプリケーション起動時にログイン処理メソッドを呼び出したり、ボタンの押下時にリーダーボードの表示メソッドを呼び出したりすればOKです。
https://github.com/ttdog/GameCenterBridge