Cocos2d-xでGame Center(GameKit)、Google Play Games Servicesを使ってランキング機能を実装する

どうも、ころさめです
今回はCocos2d-xでゲーム内のランキング機能を実装したので、メモがてらここに貼っつけていきます
LobiなんかもCocos2d-xに対応していたりするので良いと思いますが、今回のアプリはカジュアルゲームだったので、ユーザー登録が必要ないGame CenterとPlay Games Servicesにしました
また、ここでは実装のみ紹介するので、コンソール側の登録などは以下などを参考にしてください

Game Center機能を実装する – Qiita
Google Play Game Servicesをとりあえず使ってみる(登録編) – Qiita

ちなみにログイン完了時のコールバック処理や認証失敗時のエラーダイアログ表示などは行っていないので、それが気になる方は各自で実装をお願いします

各OS共通

RankingController.h

全OS共通のヘッダです
シングルトンパターンを使っているのでどこからでも呼べるようにしています
各メソッドがvirtualなのはiOSでオーバーライドを行うからです

RankingController.cpp

全OS共通の実装です
getInstanceはiOSのみRankingControllerを継承したインスタンスを生成するためここでは実装しません
また、Android以外のOSでもビルドが通るように何もしないメソッドを用意しています(iOSはオーバーライドで実装)
AndroidのisLogin等の実装はRankingController_Android.cppで行います

iOS

RankingController_iOS.h

iOS用のヘッダです
RankingControllerの継承クラスと、Objective-CのGameCenterControllerクラスを宣言しています
GameKitを使用するので、Build PhasesのLink Binary With LibrariesからGameKit.frameworkを追加してください
GameCenterControllerクラスを用意する理由はGKGameCenterControllerDelegateを使用するためです

RankingController_iOS.mm

iOS用のObjective-C++の実装部分です
GameCenterControllerでは実際にGameKitを使ってログインやスコアの更新、ランキングの表示を行っています
LEADER_BOARD_IDにはiTunes Connectで設定したリーダーボードのIDを入れてください
スコア送信失敗時や未ログイン時のランキング表示失敗などのエラー表示は特に何もしていないので、必要な場合は何かしらの処理を入れてください
また、ランキングの集計期間を1日や1週間にしたい場合は、GKGameCenterViewControllerのleaderboardTimeScopeをGKLeaderboardTimeScopeTodayやGKLeaderboardTimeScopeWeekに変更してください
RankingController_iOSではGameCenterControllerの生成と呼び出しを行っています
ここでRankingControllerのgetInstanceの実装を行うことで、iOSでのみgetInstance時にRankingController_iOSを生成するようにしています

Android

RankingController_Android.cpp

RankingControllerのAndroidでの実装部分です
基本的にはPlayGamesController.javaのメソッドをJNI経由で呼んでいるだけです
PlayGamesControllerはシングルトンなので、staticのメソッドを呼ぶのではなく、PlayGamesControllerのインスタンスを取得してからそのインスタンスのメソッドを呼んでいます

PlayGamesController.java

AndroidのJava側の実装です
この実装を行う前に、PlayGamesServicesAPIを使うためにapp/build.gradleに以下を追加してください

後ろのバージョンはその時のGooglePlayAPIのバージョンに合わせてください
また、GooglePlayDeveloperConsoleで実績を5つ以上、リーダーボードを1つ以上設定した上でリソースを取得し、res/valuesに保存してください
その上で、AndroidManifest.xmlに以下を追加してください

この状態で上記PlayGamesControllerを実装して、R.string.leaderboard_の部分を設定したリーダーボードの名前に書き換えてください
ちなみにこのクラスはActivityではないのでonActivityResultが呼ばれないため、AppActivityに以下を追加してください

これらを実装した上で、C++部分で以下のような実装を追加してください

このようにすれば、iOSであればGameCenter、AndroidであればGooglePlayGamesServicesを使ってランキングの更新、ランキングの表示が行えると思います

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です