0
    アニメーションの実装が完了したところで、
    いよいよ、ボタンを押して、画像を動かすプログラムに入りたいと思います

    [今回の内容]
    ■キリンさんを移動させるために
    ■キリンさんを左に移動させる
    ■キリンさんを右にも移動させる


    ■キリンさんを移動させるために

    そのために、まず「ボタンを押した」かどうかを判断させる必要があります

    そこで、BOOL という値を使います
    BOOL は、「真(TRUE)」であるか「偽(FALSE)」であるかの
    2つの値だけをもちます

    ここでは、
    ■TRUE ・・・ボタンを押した
    ■FALSE ・・・ボタンを押していない
    として使用します

    では、TestGameViewController.h を選択して
    UIImageView *greenIV, *kirinIV;
       
    UIButton *moveLBT, *moveRBT;
       
    BOOL moveLFlag, moveRFlag;

    bool

    moveLFlag は、左移動ボタン(moveLBT) の状態を判定させ、
    moveRFlag は、右移動ボタン(moveRBT) の状態を判定させます

    ...

    次に、TestGameViewController.m に移って
    - (void)loadView の中に、赤い部分を追加
    self.displayLink = nil;


    moveLFlag = FALSE;
    moveRFlag = FALSE;

    initialize

    ここは、アプリを起動した直後に呼ばれるところなので、
    値を [FALSE] に初期化して、「ボタンを押していない」状態にしておきます

    ■キリンさんを左に移動させる

    そこで、いよいよアニメーション部分に突入します
    まずは、Lボタンの方だけやってみましょう

    - (void)drawFrame の中に「ボタンを押されたとき」を記述します
    - (void)drawFrame
    {
        if(moveLFlag == TRUE){

        }
    }

    状態を判断させるのに、「if」を使用しています
    他に「switch-case」などスマートに使う方法があるかもしれませんが、
    ここはまあ、記述のわかりやすい「if」を使わせてください

    上の文は、
    「もし(if)、[ボタンが押されている(moveLFlag == TRUE)]とき」を表しています
    if の中が「=」でなく、「==」であることに注意してください

    そして、if の中へ、- (void) moveL_touchDown:(id)sender の中に
    書いてあるものをそのまま移し変えましょう
    - (void)drawFrame
    {
        if(moveLFlag == TRUE){
            CGRect frame = kirinIV.frame;
            frame.origin.x -= 1.0;
            [kirinIV setFrame:frame];
           
            NSLog(@"MOVE(L):%.1f", frame.origin.x);
        }
    }

    ここで、キリンさんの移動量を「1.0」に修正してください

    最後に、- (void) moveL_touchDown:(id)sender の中で、
    moveLBT(左移動ボタン)を押したとき、の内容を追加します
    - (void) moveL_touchDown:(id)sender
    {   
        moveLFlag = TRUE;
    }

    moveL

    これで、
    1)左移動ボタンを押して、moveLFlag を TRUE にする
    2)moveLFlag が TRUE になったので、キリンさんを左へ移動させる
    の流れができたことになります

    それでは、[Run]して [<-L]ボタンを押してみましょう
    moveL

    キリンさんは、うまく移動しましたか?


    ■キリンさんを右にも移動させる

    同様に、右にも移動できるようにしましょう
    もう同じようにすればいいんですよね
    カンタン、カンタン!

    - (void) moveL_touchDown:(id)sender
    {   
        moveLFlag = TRUE;
    }

    - (void) moveR_touchDown:(id)sender
    {   
        moveRFlag = TRUE;
    }

    - (void)drawFrame
    {
        if(moveLFlag == TRUE){
            CGRect frame = kirinIV.frame;
            frame.origin.x -= 1.0;
            [kirinIV setFrame:frame];
           
            NSLog(@"MOVE(L):%.1f", frame.origin.x);
        }
       
        if(moveRFlag == TRUE){
            CGRect frame = kirinIV.frame;
            frame.origin.x += 1.0;
            [kirinIV setFrame:frame];
           
            NSLog(@"MOVE(R):%.1f", frame.origin.x);
        }

    }
    ※右の移動量も1.0に変更してください

    moveR

    それでは、[Run]!

    左にいって〜〜〜

    右にいって〜〜?

    右に... ?

    みぎっ!?

    み...

    動きません

    左にもっ!?... 壊れた!!

    stop

    なにが起こっているのでしょうか?

    その原因は、moveLFlag と moveRFlag が両方ともに
    TRUE(押した状態)のままになっていることなんです

    なので、- (void)drawFrame の中で、
    最初の if で左に1ピクセル移動、次の if で右に1ピクセル移動... が
    繰り返され、結局もとの位置に戻ってしまって、
    キリンさんが動いていない(ように見える)のです

    まさに、一進一退の膠着状態ですね

    ...ということは、「押した状態」を解除する必要がありますね

    右ボタンを押したら -> 左ボタンを押した状態を解除
    左ボタンを押したら -> 右ボタンを押した状態を解除

    よしよしOK!

    - (void) moveL_touchDown:(id)sender
    {   
        moveLFlag = TRUE;
        moveRFlag = FALSE;
    }

    - (void) moveR_touchDown:(id)sender
    {   
        moveRFlag = TRUE;
        moveLFlag = FALSE;
    }

    false

    いくぞっ![Run]
    左いって〜右いって〜〜〜
    moveR

    やった〜〜〜〜〜!!

    うまくいった〜〜〜〜!

    すげ〜!

    ... えっ?

    ちょ、ストップ!!

    ... 誰か止めて〜!!!!

    止まりません
    ※[Run]のとなりの[Stop]を押せば止まります

    では、止められるようにしましょう

    どうしましょうか?

    現状は...

    今は「ボタンを押したら動きます」
    ん?「ボタンを離しても... 動きます」

    「ボタンを離したら止まる」ようにすればいいのですね

    ...

    これからまたすこし長くなるので次の回へ移りましょう



    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック

    Calendar
    S M T W T F S
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    30      
    << June 2019 >>
    My Apps
    有料アプリ

    無料アプリ

    Selected entries
    Categories
    AdSense
    Sponsored Links
    Archives
    Recent comment
    Links
    Profile
    Search this site.
    Others
    Mobile
    qrcode
    powered
    無料ブログ作成サービス JUGEM