2012年10月14日

Game CenterのLeaderboardの表示

今週はGame Centerへの対応に挑戦してみました。

とりあえずiTunes Connectへのアプリの登録。思ったよりもサクサクと登録完了。
一番時間がかかったのは後回しにしていたアイコンの作成だったり。

ということで作成したアイコンはこちら。

Icon.png

続いてiTunes ConnectでGame Centerの設定も特に問題なく完了。

問題はここから。
Leaderboardを表示するためにはView Controllerが必要です。
View Controllerってなんですか?
はい、わかりません。

今のところcocos2dを使ったプログラミングしかやったことないので、 iOSの基本的なプログラミングというやつがさっぱりだったりします。

適当に調べてみたところView Controllerというやつはクラスで言うとUIViewControllerというやつらしく、 さらにこの親玉がUINavigationControllerというやつで、cocos2dの場合はAppDelegateでこいつを使っているようだということが判明。

どうやらUINavigationControllerはUIViewContollerのサブクラスなようなのでこいつを使ってLeaderboardを表示してみることにしました。

Leaderboardの表示にはGKLeaderboardViewControllerDelegateプロトコルに適合したView Controllerが必要らしいので、 UINavigationControllerを継承してGKLeaderboardViewControllerDelegateプロトコルに適合したクラスを作ってみます。

AKNavigationController.h
@interface AKNavigationController : UINavigationController<GKLeaderboardViewControllerDelegate>

@end

どうでもいいですが、AKは私のイニシャルです。

で、GKLeaderboardViewControllerDelegateプロトコルはleaderboardViewControllerDidFinish:が必要なので実装。

AKNavigationController.m
- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{
    [self dismissModalViewControllerAnimated:YES];
}

これをAppControllerで使用しているUINavigationControllerと差し替えます。

AppDelegate.h
@interface AppController : NSObject <UIApplicationDelegate, CCDirectorDelegate>
{
    UIWindow *window_;
    AKNavigationController *navController_;
    CCDirectorIOS *director_;    // weak ref
}

AppDelegate.h
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    /* 中略 */

    // Create a Navigation Controller with the Director
    navController_ = [[AKNavigationController alloc] initWithRootViewController:director_];

これでLeaderboardを表示する準備が整ったので以下のような処理で表示をさせてみます。

- (void) showLeaderboard
{
    // LeaderboardのView Controllerを生成する
    GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
    
    // LeaderboardのView Controllerの生成に失敗した場合は処理を終了する
    if (leaderboardController == nil) {
        return;
    }
    
    // View Controllerを取得する
    AKNavigationController *viewController = (AKNavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;
    
    // delegateを設定する
    leaderboardController.leaderboardDelegate = viewController;
    
    // Leaderboardを表示する
    [viewController presentModalViewController:leaderboardController animated:YES];
}

これでOKと思ったら、もうひとつトラップ。
なぜかアプリ起動時にabort。 ログを見るとPortraitへの対応がどうたらとか出ている。
確かに傾撃は画面の向きはLandscapeにしか対応していないので試しに設定を変えてみると無事にGame Centerのようこそ画面が表示されました。

どうやらiOS 6のバグでGame Centerのようこそ画面を表示するときに強制的に画面を縦表示にするので、縦画面に対応していないアプリはエラーになってしまうようです。

しょうがないので対応する画面の向きにPortraitを追加して、shouldAutorotateToInterfaceOrientation:で回転できる方向を制限しようとしたら、更にトラップ。
iOS 6ではshouldAutorotateToInterfaceOrientation:は使用されなくなったとのこと。代わりにshouldAutorotateとsupportedInterfaceOrientationsを使うようになっているようです。

せっかくなので先ほど作ったAKNavigationControllerに追加することにします。

AKNavigationController.m
- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscapeRight;
}

今度こそ無事にGame Centerのサインインが完了。
ちゃんとLeaderboardも表示されました。

2012-10-14 20.03.35.png

スコアの送信処理をまだ作っていないので中身は空っぽですが。
posted by かねだ at 20:32| Comment(0) | 開発記録 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

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