2011年3月25日金曜日

GameKitで小数を送信する

GameKitでスコアやランキングデータを送信する時、Appleのドキュメントでは整数(int64)のデータを送信する方法しか載っていないので、タイムなどの小数(45.67秒等)を送信したい場合は一瞬戸惑います。

小数を送信する場合、NSNumberクラスを使用します。
NSNumberクラスはBoolやdouble,Int型などのprimitive型をオブジェクトにしたい場合に使用する便利なクラスです。


-(void)reportScores:(double)score forCategory:(NSString*)category
{
scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
NSNumber *numScore = [NSNumber numberWithDouble:round(score * 100)];
scoreReporter.value = numScore.intValue;
[scoreReporter reportScoreWithCompletionHandler:^(NSError* error) {
if (error != nil) {
// エラー処理
return;
}
}];
}


Appleのドキュメントに載っているスコア送信例を、double型を送信するように変更してあります。
上の例では、少数以下2桁を送信する例です。
引数のdouble型scoreを整数にしたいので100倍してNSNumber型のオブジェクトにします。
その後、そのint値(64ビット値)をGKScoreオブジェクトに設定しています。
勿論、iTunesでリーダーボードのスコア設定をDecimal小数2桁等、小数を扱うように設定しておく必要はあります。

後はAppleドキュメントに載っている様にランキング受信処理でGKScoreのformattedValueプロパティを参照すれば、iTunesで設定したフォーマットでNSString文字列が取得できます。

2011年3月2日水曜日

IOS4以降のアニメーション

IOS4以降のアニメーションは、[UIView animateWithDulation:delay:options:animations:completion:]を使います。IOS4以降でも従来のアニメーションは行えるようですが、非推奨となってしまったようです。
もっと簡易的に使えるメソッドもありますが、これだけ覚えておけば事足りるかもしれません。


[UIView animateWithDuration:0.5
delay:0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
button.alpha = 0.0; // UIButtonインスタンスを徐々に透明に
}
completion:^(BOOL finished){
button.alpha = 1.0f; // buttonを現す
}];


第一引数はアニメーションにかける時間を指定します。上記例では0.5秒間でボタンを徐々に透明にしていきます。
delayはアニメーションを開始する時間を指定します。上記例では0なので即時アニメーション開始です。
optionsはアニメーションの動作のオプションです。上記例ではEaseOutで徐々に速度を落としてアニメーションをさせています。
animationsが実際のアニメーションの指定です。
completionはアニメーションが終了した時に呼び出される処理です。上記例では徐々に透明になったボタンの姿を再度現すようにしています。