こんにちは、

おひさしぶりです。

ついに梅雨入りで、雨ばっかりの天気予報になってしまいましたね。

ちなみに今気づいたのですが、
「つゆいり」で変換すると、「入梅」なんですね。
「梅雨入り」にも変換されるのですが、「入梅」!

さて前回の続き、画面をタッチしたとき、れで、1枚目のパネルが選択されてない時に実行されるのが、続きのコレでしたね。

さくっと解説しちゃいます。
これはアニメーションのプロパティ設定をして、パネルのレイヤにアニメーションを適用させてるだけなんです。



// 最初のパネルの選択

if (!movingLayer1) {
CABasicAnimation *animation =
[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.duration = 1.0;
animation.repeatCount = HUGE_VALF;
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat:M_PI*2];
[layer addAnimation:animation forKey:@"rotation"];
movingLayer1 = layer;
}


最初のifの条件については、前回に解説したとおり、「選択中のパネルが無い」ときでしたね。
このときに以下の処理を実行します。

まず、CABasicAnimationクラスについて、

このクラスはインスタンスを作成するとき、アニメーション対象となるプロパティの名前を指定します。
transform.rotation のところが、
回転のアニメーションをするということを指定しています。
詳しくはわかんないので、もっと知りたい人は他のサイトを参考にしてね(・・;)
次からは、animationのプロパティ設定です。
 duration は、実行時間の設定です。
  1.0としてますので、動き始めてから1.0秒で1回の動作が終了します。
 repeatCount を HUGE_VALF にすることで、無限に繰り替えすことを設定できます。
 fromValue は アニメーションを開始する回転角を指定します。
  今回はtransform.rotationなので、float型に変換して設定しています。
 toValue は予想のとおり、アニメーションが終了するときの回転角を指定しています。
 PI(π)は数学のことなんで、ようわからんので許してください(ノ_・。)

で、お次のは
アニメーションはレイヤに対して、addAnimation:forKey:メソッドを呼び出すことで追加でき、追加と同時に開始します。
そとのきに、"rotation"という名前を指定して追加してます。

これは前に、アニメーションを止める(取り除く)ときに指定したキーでしたね。
あれはここで指定しています。

最後に
movingLayer1 に今回タッチされたlayerを設定してます。
今日はカンタンでしたね??

次回は、パネル交換のメソッドについてです。
よろしくー(・ω・)/

にほんブログ村 IT技術ブログ iPhoneアプリ開発へ

にほんブログ村 携帯ブログ iPhoneへ
はい、こんにちは。(^^ゞ
ではでは、本日も気合いをいれていきましょう。

前回は、画面をタッチしてパネルかどうかを判断してなんからかんたら・・・

という話をしたと思います。

では、続きのコレ
// 2枚目のパネルの選択
if (movingLayer1) {
[movingLayer1 removeAnimationForKey:@"rotation"];
movingLayer2 = layer;
if (![self swapLayers]) {
movingLayer1 = nil;
movingLayer2 = nil;
}
}
// 最初のパネルの選択



を説明したいと思います。

まず、パネル交換の流れはこうなります。

 1、ゲーム開始
     ↓
 2、タッチされるの待ってる
     ↓
 3、タッチされた(2枚目?1枚目?)
     ↓
 4-1、3で2枚目なら、1枚目2枚目入れ替えれるもんなら入れ替える
 4-2、3で1枚目なら回転させて、さらに2枚目がタッチされるの待ってる。
     ↓
 5、2へ戻る



パネルを消すとか、タイマを減らすとかは抜いていますが、
このコードは「3のタッチされた、2枚目」「4-1のパネル入れ替えメソッドの呼び出し部分」
コードになってます。

まず、一つ目のifはわかりますね?
このifが成立するのはmovingLayer1に何か存在するということなんで、すでに1枚目選ばれている場合ですね。

その次は、単純に訳す?と、movingLayer1に対して、
その引数を@"rotation"にして、removeAnimationForKeyメソッドを呼び出しています。

これはもうちょっと先でのプログラミング内容ですが、パネルを選択した時に、
「このパネルを選択した!」ということを表すためにそのレイヤに対して回転のアニメーションを追加します。
それを取り除くために書いてます。
これで1枚目の選択したパネル(movingLayer1)のくるくるが止まるそうな。。。

で、movingLayer2(2枚目のパネル用)にタッチイベントで取得できたlayerを設定します。

次のifでswapLayersをメソッドを呼び出して、1枚目と2枚目のパネルを交換します。
swapLayersでは後ほど出てきますが、交換できない(隣り合っていない)場合はNOを返す様に
プログラミングするので、そうなった場合は、movingLayer1movingLayer2nilを設定して、
なにも選択してませんよー。ってことで1枚目のタッチを待っている状態となります。


同じ流れで、1枚目のパネルが選択されてない時に実行されるのが、続きのコレになります。


// 最初のパネルの選択

if (!movingLayer1) {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
animation.duration = 1.0;
animation.repeatCount = HUGE_VALF;
animation.fromValue = [NSNumber numberWithFloat:0.0f];
animation.toValue = [NSNumber numberWithFloat:M_PI*2];
[layer addAnimation:animation forKey:@"rotation"];
movingLayer1 = layer;
}


さてさて、続きは次回となりますが、また見に来てね(*^ー^)ノ


これからもがんばりたいので、クリックお願いします(・・。)ゞ

にほんブログ村 IT技術ブログ iPhoneアプリ開発へ

にほんブログ村 携帯ブログ iPhoneへ
さて、こんばんわ。

今日は前置きなしで始めましょう。

前回は、touchesBeganメソッドは画面がタッチされた時に発生するものでした。

それの冒頭部分の説明だけをやりましたね(・∀・)

ではパネルをくるくる回すためにどのパネルが押されたか座標を取得する必要があります。

UITouch *aTouch = [touches anyObject];
CGPoint pos = [aTouch locationInView:self.view];
pos = [backView.layer convertPoint:pos toLayer:backView.layer.superlayer];


1行目の
UITouch *aTouch = [touches anyObject];
についてです。
このメソッドが呼ばれたときは、なんらかのタッチが画面に対しておこなわれました。
それが、指一つのタッチであるか、マルチタッチであるかはわかりません。
touchesにはその複数かもしれないタッチ情報が含まれているんで、
touchesに対して、anyObjectをメソッドよ呼び出す事で、タッチ情報を一つだけ取出しています。

ここからがむずいのですが、
取出したタッチ情報(aTouch)はlocationInViewメソッドで、どのビューの座標系で計算するかを
指定してタッチされた位置情報を取得します。= CGPoint pos
ただし、ビュー(UIView)が使用している座標系と、そのビューに含まれるレイヤが仕様している座標系は異なるので、
CALayerクラスのconvertPoint:toLayerを使って座標変換をしています( ̄_ ̄ i)=pos

なんとかタッチされた座標が取得できたら、その位置にあるレイヤをhitTestで取得できます。

CALayer *layer = [backView.layer hitTest:pos];

if(![layer.name hasPrefix:@"panel"] || movingLayer1 && movingLayer1 == layer){
return;
}


このlayer にリターンされてくるレイヤはbackView.layerに含まれるサブレイヤのうち、指定された位置に存在しているレイヤのみです。backView.layerそのものがリターンされている場合もあるので、
それは除外する必要があります。
パネルレイヤだけを指定したいですね。
そこで、nameプロパティがどーなっているかを調べます。
NSStringクラスのhasPrefixメソッドでレイヤの名前が"panel..."で始まっている場合だけ、
そのレイヤはパネルやった!となり処理を続けます。
それ以外の場合はリターンして処理を中断します。
あとについてるこの条件↓
movingLayer1 && movingLayer1 == layer
は、movingLayer1がnilではない(なんか設定されている)且つ、前に選ばれてるレイヤ(movingLayer1)と、
今選んだレイヤが同じ場合、成立します。
条件全体を簡単にいうと、パネル以外をタッチした場合、パネルをタッチしたけど、前回と同じパネルの場合
はリターンをしてるということです。

はい、今日はここまでです。

次回は、すでにどっかのパネルが選択されている状態でほかのパネルを選択したら時の
説明をしたいと思います。(;´▽`A``

これからもがんばりたいので、クリックお願いします(・・。)ゞ

にほんブログ村 IT技術ブログ iPhoneアプリ開発へ

にほんブログ村 携帯ブログ iPhoneへ