2015年5月27日水曜日

SKAction runBlock:について

SpriteにActionを設定するやり方の一つに、block構文を用いる runBlock: メソッドがある。

繰り返しActionを実行する場合、Actionの都度block構文中の処理を全部やってくれるのかと思ってたが、そうじゃないようだ。

たとえば以下の様な場合、設定したmoveByX:100 y:0 duration:1は繰り返し実行してくれるが、NSLogが表示されるのは一度きり。

SKAction *action = [SKAction runBlock:^{
        NSLog(@"hogehoge");
        SKAction *ac = [SKAction moveByX:100 y:0 duration:1];
        [_sprite runAction:[SKAction repeatActionForever:ac]];
    }];
[_sprite runAction:action];

変数使ったり乱数を埋め込んだりしても、一番最初に出た値がずっと保持されるようだ。
Actionのたびに移動量をランダムで変化させるとかどうやるんだ?
どうもこのActionってやつは、決まりきった処理をさせることはできても、インタラクティブな処理(状況に応じてActionの内容や動きを変える)なんてのはできないっぽいな。
それが必要な場合はActionの外のコードで状況をチェックして、再度Actionを設定するとかそういう処理が必要っぽい。なんだよ、使えねえな。


なお、block中で
[_sprite runAction:[SKAction repeatActionForever:ac]];
とやってやらないと、うまくいかない。
blockの外の
[_sprite runAction:action];
の位置で
[_sprite runAction:[SKAction repeatActionForever:action]];
とやってやると、block中の処理は繰り返されるようになるが、それ以外の処理を受け付けなくなったり、いいことない。
実際のActionを繰り返すのでなく、blockの定義自体を繰り返すことになっているんだろう。
(最後XcodeからもiPad実機からも終了できなくなり、リセットするに至った(ノД`))
なかなかむずかしい。



同様にblock構文が使える
customActionWithDuration: actionBlock:
を使ったら、こちらも一度しか呼ばれないし、Durationの数値を変えるとblock中の変数の値が、途中からとんでもなくでかい数値になったりしてますますわかんない。
これは別の記事に書く。

0 件のコメント:

コメントを投稿