さて、お久しぶりです。

最近引っ越しをしたんで、PCを触れない日が続いてました(ノ_-。)

頭が白紙に戻りましたが、気を取り直したいと思います(・∀・)

では早速ですが、

前回、PlayViewController.hに追加した

    CALayer *movingLayer1;
    CALayer *movingLayer2;

のCALayer型の変数と、

    swapLayers;

メソッドですが、

前の二つの変数は交換対象とする2枚のパネルを参照するために定義してます。
で、メソッドは交換の時のアニメーションを実行するメソッドとして定義しました。

さてここで、ユーザーがパネルを触った時にまず呼び出されるメソッドを実装します。
swapLayersとは別のメソッドでゲームの進行とは別にいつでも呼び出されます。
ここにパネルをくるくる回すコードを実装してます。
具体的にどんなメソッドが呼ばれるのかというと、

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
 ・・・
}

です。

なんとなくtouchesBeganという名前から予測できたかもしれないですね。
ではでは。中身の解説
まず、冒頭の
if(isFinished || state != PlayStateChoose){
return;
}

は、さきほども言いましたが、このtouchesBeganはいつでも、
画面をタッチしたら必ず呼ばれてしまいますので、もしパネルを消すアニメーション中の時は
このクルクル回るのが実行されては困る(というより今回はやめとく)ので、ここでハジイてしまいましょう。ヽ(゚◇゚ )ノ
isFinished が True の時はタイムアップの時でしたね。
PlayStateChooseではない状態(!=がついてるので)つまり、パネルを選択できる状態ではない場合
このときは、touchesBeganメソッドは即returnが返って終了です(^-^)/


今日は短くてごめんなサイですが、次回はすぐにアップしたいと思います。




モチベーションをUPさせるためにも、応援よろしくお願いしますね(*^ー^)ノ

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

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



こんにちわ。ご無沙汰ですね(;^_^A

さて今日からは、ゲームの操作のところを作っていきましょう。

今日もコードをざっと載せてみて、とりあえずこんな風に動く!

って確認してから、次回に説明する!というカンジでいきたいと思います。

まず、PlayViewController.hに変数を2つをメソッド1つ追加します。


@interface PlayViewController : UIViewController {

IBOutlet UIImageView *backView;
IBOutlet UIImageView *frontView;
IBOutlet UILabel *scoreLabel;
IBOutlet UILabel *timeLabel;

PlayState state;
BOOL isFinished;

CALayer *movingLayer1;
CALayer *movingLayer2;

}

- (BOOL)swapLayers;




↑赤いところが今回追加したところ。

実際実装するとこんな感じです。

$無知の状態からiPhoneアプリ開発に挑んでみる-2011-5-2-1


次にPlayViewController.mに以下をまるごと追加します。
追加する場所は@endの手前でいいでしょう(‐^▽^‐)


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if(isFinished || state != PlayStateChoose){
return;
}

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

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

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

// 2枚目のパネルの選択
if (movingLayer1) {
[movingLayer1 removeAnimationForKey:@"rotation"];
movingLayer2 = layer;

if (![self swapLayers]) {
movingLayer1 = nil;
movingLayer2 = nil;
}
}

// 最初のパネルの選択
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;
}

}
- (BOOL)swapLayers {
return NO;
}




とりあえず、ここまでコーディングしたら実行してみましょう。
さてどんなんになるかな??

パネルをクリックすると、くるくる回ります!
ほかのパネルを回すと次はそれが回る!

楽しい楽しいp(^-^)q

右上のパネルをクリックした時↓
無知の状態からiPhoneアプリ開発に挑んでみる-2011-5-2-3

左下のパネルをクリックした時↓
無知の状態からiPhoneアプリ開発に挑んでみる-2011-5-2-4

三角を押したときはなんか回転の中心がずれてる・・・。
用意した図形がおかしかったのかな?
まいっか(^▽^;)

まだ入れ替えはできないけど、次回はこのコードの説明をサクっとしたいと思います。

その前に自分も理解しないと・・・。

ではまた次回~


ランキングに参加しています。下のクリックお願いしますー(*゚ー゚*)

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

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


こんにちは(^O^)

今日は前回のプログラムの説明をしたいと思います。

難しいことはわからないので、
自分がわかる範囲でわかりやすくをモットーにしていきたいと思います(°∀°)b

では早速、はじめていきましょう。


 typedef enum{
       PlayStateChoose, //パネルの選択という状態
       PlayStateChange //パネルの交換という状態
 } PlayState;

 @interface PlayViewController : UIViewController {

       IBOutlet UIImageView *backView;
       IBOutlet UIImageView *frontView;
       IBOutlet UILabel *scoreLabel;
       IBOutlet UILabel *timeLabel;

10       PlayState state;
11       BOOL isFinished;
12 }

13 @end


まず、1~4の列挙体の宣言の部分ははなにかというと、
コメントに書いてあるとおり、
PlayStateChoose はパネルの選択という状態
PlayStateChange はパネルの交換という状態
で、10ではそれを使うために、PlayState型の変数stateを用意してます。

必要なときにstateを設定したり、参照したりしましょうね(^O^)


続きまして、BOOL型の変数のisFinishedは、このゲームは時間制限がありますので、
残り時間がなくなったときにここに「時間切れ」をあらわす値をいれてゲームが終了したことがわかるようにします。
時間がなくなったときに「YES」にします。


 - (void)viewWillAppear:(BOOL)animated{
       srand((unsigned)time(NULL));
       state = PlayStateChoose;
       isFinished = NO;
       for(int y=0;y<6;y++){
             for(int x=0;x<6;x++){
                CALayer *layer = [CALayer layer];
                layer.bounds = CGRectMake(0,0,42,42);
                layer.position = CGPointMake(59+(42+1)*x,53+(42+1)*y);

10                int dice = rand() % 5;
11                NSString *layerName = [NSString stringWithFormat:@"panel-%d",dice];
12                NSString *imageName = [layerName stringByAppendingPathExtension:@"png"];
13                layer.contents = (id)[UIImage imageNamed:imageName].CGImage;
14                layer.name = layerName;

15                [backView.layer addSublayer:layer];
16                }
17          }
18 }


さて、次はviewWillAppear:メソッドです。

2 のsrand~っていうのは、他の言語でもよく使われている。乱数を発生させるもの。
現在時間をtime()で取得して、乱数を作っています。毎回パネルをランダムに置くために使います。
3 は、さっき言ってたパネルの状態をあらわ数変数「state」は最初なので、パネルを選択するという状態にしてます。
 isFinished は当然始めたばかりなので「Flase」です。

5,6は縦方向と横方向にパネルを敷き詰めていく、ループになってます。
7~15は実際にパネルを置いていってる部分です。
そのうち、7~9はCALayer クラスのlayer メソッドを使って、レイヤを作成していて、
はその位置と大きさをを設定してます。位置のx座標とy座標ははあとから設定していくので0にしてます。
パネルの画像は42ピクセルの正方形でしたね。それを設定してます。
はループの変数x、yを使ってlayerpositionプロパティ(中心の座標)を設定していってます。
10で0~4の5種類の数字がランダムで生成されるので、
11では、"panel-1"やら、"panel-4"とかの文字列が作られるので、
12pngというのを見ればわかると思いますが、対応する画像ファイル名を生成してます。
13ではそれをもとにして、UIImage オブジェクトを作って、layercontentsに設定しています。
14で最後にレイヤの名前を設定します。初期ではレイヤの名前が付いていないようなので、ここで設定しています。
あとで、隣どおしが同じパネルかどうかチェックするためにつけてます。
17はちょっと難しいんですが、backViewはマス目があるビューです。
backViewlayerに対して、addSublayerメソッドを呼び出し、新しく作成したレイヤを追加することで表示できるようになるみたいです。


なんどかパネルを敷き詰めることが出来ました。
乱数を使ってるんで起動ごとに、パネルの配置がいろいろかわってることがわかると思います。

次回は、パネルを選択したり交換できるようになればいいなと思ってます。

次回もよろしくです。

ランキングに参加しています。下のクリックお願いしますー(*゚ー゚*)

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

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