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

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

【cocos2d】3面ボスのカブトムシを実装してみた

BeeClusterに3面のボスを実装しました。
最強の昆虫、カブトムシです。
まずは動画をご覧ください。

何やら背中の上の回る部分から大量に弾を吐いてきます。
そして、時々自機に向かってくると弾の間隔が狭くなって避けるのが大変になります。
今はテスト実装で前景の木に視界が遮られることがありますが、実際のボス戦では木は出てこない予定です。

普段はふわふわ飛んでいて、時々自機に向かってくるアルゴリズムは次のようになっています。
moveRandomがふわふわ飛ぶ処理で、moveToBeeが自機に飛んでくる処理です。

- (void)moveRandom
{
    float moveX = MYRAND(-30, 30);
    float moveY = MYRAND(-30, 30);
    CGPoint moveBy = ccp(moveX, moveY);
    id move = [CCMoveBy actionWithDuration:1.0 position:moveBy];
    id moveBack = [move reverse];
    id sequence = [CCSequence actions:move, moveBack, nil];
    [_target runAction:sequence];
    float dice = MYRAND(0, 10);
    if (dice <= 3) {
        _actionMethod = @selector(moveToBee);
    } else {
        _actionMethod = @selector(moveRandom);
    }
}

- (void)moveToBee
{
    CGPoint touch = ccpAdd([TouchLayer sharedTouch].location, TOUCH_OFFSET);
    CGPoint vector = ccpSub(touch, self.position);
    _heading = YES; // 頭の方向を動きに合わせる
    id move = [CCMoveBy actionWithDuration:1.5 position:vector];
    id moveUp = [CCMoveBy actionWithDuration:1.5 position:ccp(0, 100)];
    id moveRev = [move reverse];
    id moveDown = [moveUp reverse];
    id lockRotation = [CCCallBlock actionWithBlock:^{
        self.rotation = 180.0;
        _heading = NO;
    }];
    id sequence = [CCSequence actions: move, moveUp, moveRev, moveDown, lockRotation, nil];
    [_target runAction:sequence];
    float dice = MYRAND(0, 10);
    if (dice <= 3) {
        _actionMethod = @selector(moveToBee);
    } else {
        _actionMethod = @selector(moveRandom);
    }
}

_headingというインスタンス変数は、カブトムシの頭の向きを進行方向に向けるかどうかを設定するフラグです。ふわふわ飛んでいるときはNOになっていて、自機に向かってくるときはYESにしています。
3/10の確率で自機に飛んできます。
次に実行するセレクターを_actionMethodインスタンス変数に入れておきます。
update:メソッドでアクションが終了したかどうか常にチエックしており、終了した場合は、_actioMethodに入れておいた処理を実行します。
詳しくは、こちらをご覧ください。