2015年04月05日

cocos2d-xでのGame Center対応

傾撃でもGame Centerに対応していたのですが、iOSのバージョンアップやらcocos2dからcocos2d-xへの変更やらで作り直しをしました。

iTunes Connectにはすでにアプリを登録していたのですが、長いこと放置していたら削除されてしまったので登録からやり直しです。

特に迷うところもないのですが、念のため忘れ防止にメモ書きしておきます。ただ、プログラム周りはあんまり理解せずにググって出てきたものを真似して作ってるところもあるので、もしかするとあんまり正しいやり方じゃないかもしれません。

iTunes Connectでのアプリ登録とGame Centerの設定

  1. iTunes Connectにログイン。
  2. 左上のマイAppのアイコンをクリック。
  3. 左上の+のボタンをクリックして、表示される"新規 iOS App"をクリック。
  4. 以下の設定を入力して"作成"ボタンをクリック。(1作目なのにToritoma2なのはToritomaで作成して放置してたのが削除されて同じ名前が使えなくなったため)
    • 名前 : Toritoma2
    • プライマリ言語 : English
    • バンドルID : com.monochrom-soft.Toritoma2
    • バージョン : 1.0
    • SKU : Toritoma2
  5. 作成されたアプリを選択して、画面真ん中あたりの"Game Center"をクリック。
  6. "シングルゲーム向けに有効化"を選択。
  7. "Leaderboardの追加"をクリック。
  8. シングルLeaderboardの方の"選択する"ボタンをクリック。
  9. 以下の項目を入力。
    • Leaderboardの参照名 : toritomascore
    • Leaderboard ID : toritomascore
    • スコアのフォーマットタイプ : Integer
    • スコア送信タイプ : ベストスコア
    • 並び替えの順序 : 降順
    • スコアの範囲 : (空欄のまま)
  10. "言語を追加"をクリック。
  11. 以下の項目を入力して"Save"をクリック。
    • 言語 : English
    • 名前 : High Score
    • スコアのフォーマット : Integer (100,000.123)
    • スコアのフォーマットサフィックス : (空欄のまま)
    • スコアのフォーマットサフィックス(... : (空欄のまま)
    • 画像 : 1024x1024のアイコンを指定
  12. 右下の"Save"をクリック。
  13. 右下の"Done"をクリック。

プロジェクトにGameKit.frameworkを追加

  1. Xcodeの左側のNavigatorでプロジェクトを選択。
  2. TARGETSの"xxx iOS"を選択。
  3. "Build Phases"を選択。
  4. "Link Binary With Libraries"の中身を表示して、+のボタンをクリックして、GameKit.frameworkを追加する。

RootViewControllerにGKGameCenterControllerDelegateを実装する

RootViewController.hにてGameKit.hをimportしてGKGameCenterControllerDelegateのプロトコルを実装する。

#import <GameKit/GameKit.h>

@interface RootViewController : UIViewController<GKGameCenterControllerDelegate> {

RootViewContoller.mmにgameCenterViewControllerDidFinishを実装する。

- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

Game Centerアクセス用のクラスを作成

今回はc++とネイティブコードの橋渡しをするクラスをOnlineScore、Game Center呼び出しを行うクラスをGameCenterHelperとしました。まだ作ってないですがAndroidでSCOREBOARDに対応するときはScoreBoardHelperとか作ろうかと思っています。

OnlineScore.h

class OnlineScore {
public:
    static void login();
    static void openRanking();
    static void postHighScore(int score);
};

OnlineScore.mm

void OnlineScore::login()
{
    [GameCenterHelper login];
}

void OnlineScore::openRanking()
{
    [GameCenterHelper openRanking];
}

void OnlineScore::postHighScore(int score)
{
    [GameCenterHelper postHighScore:[NSNumber numberWithInt:score]];
}

GameCenterHelper.h

#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>

@interface GameCenterHelper : NSObject

+(void)login;
+(void)openRanking;
+(void)postHighScore:(NSNumber *)score;

@end

GameCenterHelper.m

#import "GameCenterHelper.h"
#import "RootViewController.h"

static NSString* const LEADERBORD_ID = @"toritoma_score";

@implementation GameCenterHelper

+(void)login
{
    GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
    localPlayer.authenticateHandler = ^(UIViewController *viewController, NSError *error) {
        if (viewController != nil) {

            UIWindow *window = [UIApplication sharedApplication].keyWindow;
            if (window == nil) {
                window = [[UIApplication sharedApplication].windows objectAtIndex:0];
            }
            [window.rootViewController presentViewController:viewController animated:YES completion:nil];
        }
    };
}

+(void)openRanking
{
    GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
    if (gameCenterController != nil) {

        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        if (window == nil) {
            window = [[UIApplication sharedApplication].windows objectAtIndex:0];
        }

        if ([window.rootViewController isKindOfClass:[RootViewController class]]) {

            RootViewController *rootViewController = (RootViewController *)window.rootViewController;

            gameCenterController.gameCenterDelegate = rootViewController;
            gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
            gameCenterController.leaderboardTimeScope = GKLeaderboardTimeScopeToday;
            gameCenterController.leaderboardCategory = LEADERBORD_ID;
            [rootViewController presentViewController: gameCenterController animated: YES completion:nil];
        }
    }
}

+(void)postHighScore:(NSNumber *)score
{
    GKScore *scoreReporter = [[GKScore alloc] initWithLeaderboardIdentifier:LEADERBORD_ID];
    scoreReporter.value = score;
    scoreReporter.context = 0;

    NSArray *scores = @[scoreReporter];
    [GKScore reportScores:scores withCompletionHandler:^(NSError *error) {
        //Do something interesting here.
    }];
}

@end

呼び出し部分の作成

AppDelegate::applicationDidFinishLaunching()にOnlineScore::login()を呼び出す処理を追加して、ゲームオーバー時にOnlineScore::postHighScore()を、ランキング表示ボタンをタップした時の処理にOnlineScore::openRanking()を呼び出す処理を追加して終わりです。

実機での実行

iPhoneでテスト実行する際にはあらかじめ"設定"の"Game Center"から"サンドボックス"を有効にしておく必要があります。

posted by かねだ at 22:57| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は180日以上新しい記事の投稿がないブログに表示されております。