前回のサンプル、リンクが間違ってました。やっちまった。
------------
サンプルプロジェクト:Chimpanzee-15.zip
ま、気を取り直して...
違和感があるのはゲーム画面と設定画面のリングのサイズが一致しないからなわけで、リングの配置や数が両画面で一致するのが最良なわけだ。
スライダーの変更で、こんな感じで設定画面が変化してくれるといいわけですよ。
実際の設定の流れをたどってみると以下のような値の変化になる。
設定ビューのスライダ値0.0~1.0はChimpanzeeGameAppDelegateの
buttonSizeIndex = (int)([inButtonCountSliderValue] * 2.999);
横や縦のボタンの数 = butonCount[buttonSizeIndex];
という計算値をChimpanzeeGameViewControllerにsetSizeメッセージを送ることでボタンを配置させているわけで、このsetSizeメソッドでのボタン矩形の計算値がFlipsideViewのdrawRectで手に入ればいいわけだ。
ということで、まずは試しに、ボタン矩形問い合わせ用のメソッドを
ChimpanzeeGameAppDelegate
に用意して、FlipsideViewのdrawRectメソッド内から(今回はどうなるか手っ取り早く確認したいのでFlipsideViewに組み込むけど、ここらへんは検討してみる必要あり)呼び出してみる。問い合わせ用のメソッドは以下のようになる。
inButtonCountSliderValueを渡すことで、outWidth~outVCountを受け取るようになっている。
ただし、ChimpanzeeGameAppDelegateが決定できるのは、横と縦のボタン数だけなので、ボタンの大きさを決定しているChimpanzeeGameViewControllerにも同じように問い合わせ用のメソッドが必要になる。
このメソッドでsetSizeメソッドでやってる以下の計算をおこなえば必要な値が得られることになる。今気づいたけどMERGINじゃなくMARGINですな。
あとはFlipsideViewにChimpanzeeGameAppDelegateのインスタンスを渡しておいて、drawRect内で呼び出して利用してもらえばいい。そのため
FlipsideView.h
には
@interface FlipsideView : UIView {
・
・
id calculator;
}
でChimpanzeeGameAppDelegateのインスタンスを記憶できるように
FlipsideView.m
に
- (void)setCalculator:(id)inCalculator {
calculator = inCalculator;
}
と、このcalculator にメッセージを送った結果でリングを描いていくようにdrawRectを変更すれば実装終了。
整理すると、呼び出しの流れはこんな感じになる。
今回は連動なので、ChimpanzeeGame.xcodeprojを起動して実行させます。あ~ららっと、白地だから、なんかサイケデリックざんす。まあ、スライダを動かしてカクカクとボタンのサイズが変化するのは、まずまずですな。
しかし、この状態はChimpanzeeGameAppDelegate、ChimpanzeeGameViewController、FlipsideViewががっちり絡み過ぎで具合悪いです。
そこらへんを次回。
------------
サンプルプロジェクト:Chimpanzee-16.zip
------------
サンプルプロジェクト:Chimpanzee-15.zip
ま、気を取り直して...
違和感があるのはゲーム画面と設定画面のリングのサイズが一致しないからなわけで、リングの配置や数が両画面で一致するのが最良なわけだ。
スライダーの変更で、こんな感じで設定画面が変化してくれるといいわけですよ。
実際の設定の流れをたどってみると以下のような値の変化になる。
設定ビューのスライダ値0.0~1.0はChimpanzeeGameAppDelegateの
buttonSizeIndex = (int)([inButtonCountSliderValue] * 2.999);
横や縦のボタンの数 = butonCount[buttonSizeIndex];
という計算値をChimpanzeeGameViewControllerにsetSizeメッセージを送ることでボタンを配置させているわけで、このsetSizeメソッドでのボタン矩形の計算値がFlipsideViewのdrawRectで手に入ればいいわけだ。
ということで、まずは試しに、ボタン矩形問い合わせ用のメソッドを
ChimpanzeeGameAppDelegate
に用意して、FlipsideViewのdrawRectメソッド内から(今回はどうなるか手っ取り早く確認したいのでFlipsideViewに組み込むけど、ここらへんは検討してみる必要あり)呼び出してみる。問い合わせ用のメソッドは以下のようになる。
-(void)calcButtonSize:(double)inButtonCountSliderValue // スライダの値 0.0 から 1.0
width:(int*)outWidth // ボタンの横幅
height:(int*)outHeight // ボタンの高さ
margin:(int*)outMargin // ボタン間のすきま
hCount:(int*)outHCount // 横のボタン数
vCount:(int*)outVCount; // 縦のボタン数
inButtonCountSliderValueを渡すことで、outWidth~outVCountを受け取るようになっている。
ただし、ChimpanzeeGameAppDelegateが決定できるのは、横と縦のボタン数だけなので、ボタンの大きさを決定しているChimpanzeeGameViewControllerにも同じように問い合わせ用のメソッドが必要になる。
-(void)calcButtonSize:(int)inHCount // 横のボタン数
vCount:(int)inVCount // 縦のボタン数
width:(int*)outWidth // ボタンの横幅
height:(int*)outHeight // ボタンの高さ
margin:(int*)outMargin; // ボタン間のすきま
このメソッドでsetSizeメソッドでやってる以下の計算をおこなえば必要な値が得られることになる。今気づいたけどMERGINじゃなくMARGINですな。
static const int BUTTON_MARGIN = 10; // ボタン間隔
int BUTTON_WIDTH = (_view.bounds.size.width - BUTTON_MARGIN
- ((hCount - 1) * BUTTON_MARGIN)) / hCount; // ボタンの幅
int BUTTON_HEIGHT = (_view.bounds.size.height - BUTTON_MARGIN
- ((vCount - 1) * BUTTON_MARGIN)) / vCount; // ボタンの高さ
あとはFlipsideViewにChimpanzeeGameAppDelegateのインスタンスを渡しておいて、drawRect内で呼び出して利用してもらえばいい。そのため
FlipsideView.h
には
@interface FlipsideView : UIView {
・
・
id calculator;
}
でChimpanzeeGameAppDelegateのインスタンスを記憶できるように
FlipsideView.m
に
- (void)setCalculator:(id)inCalculator {
calculator = inCalculator;
}
と、このcalculator にメッセージを送った結果でリングを描いていくようにdrawRectを変更すれば実装終了。
整理すると、呼び出しの流れはこんな感じになる。
今回は連動なので、ChimpanzeeGame.xcodeprojを起動して実行させます。あ~ららっと、白地だから、なんかサイケデリックざんす。まあ、スライダを動かしてカクカクとボタンのサイズが変化するのは、まずまずですな。
しかし、この状態はChimpanzeeGameAppDelegate、ChimpanzeeGameViewController、FlipsideViewががっちり絡み過ぎで具合悪いです。
そこらへんを次回。
------------
サンプルプロジェクト:Chimpanzee-16.zip