読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】CCAction実行中に他のCCActionを重ねて実行できるのか検証

cocos2d

前回、CCCallBlockのところで「例えば、一発で死なないオブジェクトの場合、フェードアウトではなく点滅アクションを入れ、その後でscheduleUpdateであたり判定を再開するような感じでCCCallBlockアクションを使えると思います。」などと書いたのですが、敵がなんらかのCCActionで動いているときに点滅のCCActionを重ねて実行できるのか心配になったのでちょっと実験してみました。
で、検証用に作ったのがこのプログラムです。検証用なので、パーティクルの処理は外しています。[self unscheduleUpdate];の行から[self runAction:sequence];の行までが該当部分になります。unscheduleUpdateで一旦あたり判定をとめ、1秒間で5回点滅するCCBlinkアクションを行い、それが終わったらCCCallBlockでscheduleUpdateする流れになっています。実行してみると、敵が動きながら点滅している事が確認できました。

- (void)update:(ccTime)delta
{
    // 当たり判定
    CCArray* array = [MySpriteBatch sharedMyBatch].children;
    CollisionSprite* hitObject = [[MyCollision sharedMyCollision]
                                  checkCollisionBetween:self andType:kMyShip | kMyBullet inArray:array];
    if (hitObject != nil) {
        [hitObject collisionDetectedWith:self];
        [self unscheduleUpdate];
        CCLOG(@"unscheduleUpdate!");
        id blink = [CCBlink actionWithDuration:1.0 blinks:5];
        id block = [CCCallBlock actionWithBlock:^{
            [self scheduleUpdate];
            CCLOG(@"scheduleUpdate!");
        }];
        id sequence = [CCSequence actions:blink, block, nil];
        [self runAction:sequence];
    }
}

CCLOGで表示しているunscheduleUpdateとscheduleUpdateも正しく動作しているようです。unscheduleUpdate!とscheduleUpdate!の間隔は1秒より若干長めですが、まあ、誤差の範囲だと思います。
2013-04-15 17:46:20.725 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:21.743 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
2013-04-15 17:46:24.694 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:25.728 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
2013-04-15 17:46:28.679 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:29.713 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
2013-04-15 17:46:32.798 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:33.815 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
2013-04-15 17:46:36.717 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:37.750 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
2013-04-15 17:46:40.685 spriteTestWithoutBatchNode[6531:c07] unscheduleUpdate!
2013-04-15 17:46:41.702 spriteTestWithoutBatchNode[6531:c07] scheduleUpdate!
これで、硬い敵を実装できる事が確認できました。