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-cとc++のコードを混在させたコードの事をさします。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