Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2011-01-31

Game Center のリーダーボード(スコアランキング)対応アプリの作り方


iOS4.1発表以降、気にはなってたけど結局いまだに使う機会がなかったので、

Leaderboard(スコアランキング)が表示されるサンプルを作ってみました。


以下実装手順です。


iTunes ConnectでGame Centerの設定をする

  1. iOS Provisioning Portalで新規作成したApp IDでアプリを登録する(バイナリアップロードは不要)
  2. 「Manage Game Center」ボタン押下→遷移先画面で「Enable」ボタン押下
  3. リーダーボードのの設定
    • リーダーボードの名前(Leaderboard Reference Name)・・・任意
    • リーダーボードのID(Leaderboard ID)・・・任意
    • スコアのフォーマット(Score Format Type)・・・整数 / 固定小数点数 / タイム / 金額 より選択
    • ソート順・・・昇順(Ascending)か降順(Descending)かを選択
    • スコアの表記(円とか)・・・任意。ローカライズ可能

プロジェクト作成時にやること

  • Info.plist の Bundle identifier に、作成したApp IDを設定する
  • プロジェクトにGameKitフレームワークを追加

ユーザーを認証する

リーダーボードを利用するにしろ対戦ゲームをやるにしろ、Game Center機能を使う場合はまず最初にこれ。

[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
    if (error == nil) {
        // 認証に成功した場合の処理コードをここに挿入する
    } else {
        // アプリケーションはエラーパラメータを処理してプレーヤーにエラーを報告できる
    }
}];

Game Centerにスコアを報告する

  1. GKScoreインスタンスを生成する。カテゴリってのを指定する必要があるのですが、iTunes Connectで指定した「リーダーボードのID」がそれにあたるようです。
  2. valueプロパティにスコアを入れる
  3. reportScoreWithCompletionHandler:メソッドでスコアを報告する
GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:{リーダーボードのID}] autorelease];
scoreReporter.value = rand() % 1000000;	// とりあえずランダム値をスコアに
[scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
	if (error != nil)
	{
		// 報告エラーの処理
	}
}];

Leaderboardを表示する

  • ヘッダでGKLeaderboardViewControllerDelegateプロトコルへの準拠を宣言
@interface GameCenterTestViewController : UIViewController
<GKLeaderboardViewControllerDelegate>
{

}

@end
  • GKLeaderboardViewControllerを生成、表示する
- (IBAction)showLeaderboard
{
    GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
    leaderboardController.leaderboardDelegate = self;
    [self presentModalViewController:leaderboardController animated:YES];
}
  • leaderboardViewControllerDidFinish:を実装する
- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController {

	[self dismissModalViewControllerAnimated:YES];
}

動作確認

Appleのドキュメントによると、

Game Centerでアプリケーションを明確にテストするには、常に新しいテストアカウントを作成します。既存のApple IDを再利用することはできません。

とあります。


実際上記コードをデバッグビルドしてシミュレータで動作させたところ、

リーダーボード表示と同時に新アカウント作成フローに入り、

パスワードリマインダ用の質問までフル入力を求められ弱冠面倒でした。


が、がんばって入力するとちゃんとリーダーボードに表示されました。

f:id:shu223:20110131021813p:image:w240




サーバー立てずにランキング機能つけられるのはありがたいですね!

スコアの単位やタイトルもけっこう柔軟につけられるので、

今後積極的に使っていこうと思います。


ちなみに、こちらに日本語訳された「GameKitプログラミングガイド」があり、

Game Centerについてもかなり詳細な説明が書かれています。

http://developer.apple.com/jp/devcenter/ios/library/documentation/GameKit_Guide.pdf





2011-01-30

CMDeviceMotionについて調べてみる

昨日のジャイロデータに引き続き、

CoreMotionでとれるもう一つの情報「デバイスモーション」を取得してみます。


・・・と思ったけど既に詳しい記事があったので細かいコードは割愛。

http://journal.mycom.co.jp/column/iphone/027/index.html



以下調べたこと、サンプル作って試してみてわかったことをまとめます。


(ソースコード一式)

https://github.com/shu223/CMDeviceMotionTest



CMDeviceMotionからとれる情報

  • CMAttitude *attitude・・・デバイスの向き(姿勢角)
  • CMRotationRate rotationRate・・・デバイスの回転速度
  • CMAcceleration gravity・・・重力加速度
  • CMAcceleration userAcceleration・・・ユーザーがデバイスに与えている加速度

rotationRateって、CMGyroDataからとれるrotationRateと同じ?

微妙に値が違う(小数点第3位ぐらいから)けど、だいたい同じ。


gravity(重力加速度)って、地球上では常に一定?

地面と垂直方向に対して一定なんですが、

gravity の型である CMAceleration 構造体は x, y, zの値を持つので、

デバイスがどう傾いてるかでx, y, zの値が変わります。


たとえばiPhoneを平たい床に置けば z = -0.98 で他はゼロ。

立てて持つと y = -0.98 になって他がゼロになります。




2011-01-29

CoreMotionで3軸ジャイロの数値をとってみる

昨日AppleのiOSドキュメントをあさっていて、

「CoreMotion」なるフレームワークがあることを初めて知りました。


加速度センサとジャイロスコープからモーションデータを取得するためのフレームワークのようです。


そういえばジャイロって未だに何ができるのかよくわかってなかったので、

試しに使ってみました。


(ソースコード一式)

https://github.com/shu223/CMTest



手順はたったの3ステップ。

  1. alloc/initでCMMotionManagerのインスタンスを生成
  2. gyroUpdateIntervalプロパティに値の取得間隔を設定
  3. startGyroUpdatesToQueue:withHandler:メソッドで取得開始&取得時の処理を指定。

#import <UIKit/UIKit.h>
#import <CoreMotion/CoreMotion.h>

@interface CMTestViewController : UIViewController {

	CMMotionManager		*motionManager;

	IBOutlet UILabel	*xLabel;
	IBOutlet UILabel	*yLabel;
	IBOutlet UILabel	*zLabel;
}
@property (nonatomic, retain) CMMotionManager *motionManager;

@end

#import "CMTestViewController.h"

@implementation CMTestViewController

@synthesize motionManager;


- (void)viewDidLoad {
    [super viewDidLoad];

    // CMMotionManager生成
    CMMotionManager *manager = [[CMMotionManager alloc] init];
    self.motionManager = manager;
    [manager release];

    // ジャイロデータ取得間隔 [sec]
    self.motionManager.gyroUpdateInterval = 0.1;
    
    // ジャイロデータ取得開始
    NSOperationQueue *opQueue = [[[NSOperationQueue alloc] init] autorelease];
    [self.motionManager startGyroUpdatesToQueue:opQueue
                    withHandler:^(CMGyroData *data, NSError *error) {
                        // ジャイロデータ取得時に実行する処理
                        dispatch_async(dispatch_get_main_queue(), ^{
                            xLabel.text = [NSString stringWithFormat:@"%f", data.rotationRate.x];
                            yLabel.text = [NSString stringWithFormat:@"%f", data.rotationRate.y];
                            zLabel.text = [NSString stringWithFormat:@"%f", data.rotationRate.z];
                        });
                    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload {
    [super viewDidUnload];
}

- (void)dealloc {
    [self.motionManager stopGyroUpdates];
    self.motionManager = nil;
    [xLabel release];
    [yLabel release];
    [zLabel release];
    [super dealloc];
}

@end

ジャイロデータとして受け取る CMGyroData は、

rotationRate というプロパティをひとつ持つだけの、至ってシンプルなクラス。

rotationRateの型はCMRotationRateという構造体で、

x,y,z軸における回転の速さ(ラジアン/second)を保持しています。



というわけで上記サンプルを実機にインストールすると

iPhoneを動かす度に回転速度がとれるようになります。




2011-01-27

なにはともあれ開設

これから週1回は技術系の記事を書いていきます。

2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |