ゲーム開発日誌part9 Boss(ボス)との戦闘について

ゲームの魅力はボスとの戦闘。この2日間で攻撃パターンやグラフィックを考えていました。時間はかかりましたが、だいたいのカタチができたのでブログで紹介します。

今回作成したボス

まず「ボス」といっても色々種類がありますが、見た目でこいつは強そうだと思わせなければいけません。 今回はこんな「スズメバチ」をモチーフにしました。

攻撃パターン

この敵の攻撃パターンを考えます。 余り複雑すぎてもいけませんが、以下のようなパターンを考えました。

ドット絵がまだうまく描けないので、余りアニメーションがないようにします。 この辺は、出来ることとの兼ね合いで決めたほうがいいでしょう。

攻撃パターンの振り分け

かっこ良く言えばAIになるのですが、そんな難しいことはできないので、if(条件式)とrand()(ランダム)を使って行動(action)を実装します。 例えばこんな感じです。 [c] //マップに敵がいるかどうか if ([self existEnemy]) {

        int randamNum = rand()%8;

        //ランダム関数からの条件式
        if (randamNum < 2) {

            [self action2];

        //ランダム関数からの条件式
        }else if(randamNum < 4){

            [self action3];

        }else{

            [self action1];

        }

    //Playerが隣接しているかどうか。
    }else if ([self canAttack]){

        //ランダム関数からの条件式
        if (rand()%8 > 4) {

            [self action1];

        }else{

        [self action1];
        }    

    }else{

        [self action1]; 
    }

} [/c]

上記の例ではaction1,action2,action3と各行動をメソッドでまとめています。 だいたいCCActionでspriteを動かしているので、そのCCActionにTagを振り分けて管理すると色々できます。

[c]

-(void)action1{ : : : : CCAction *action = [CCSequence actions:animaite1,animaite1, nil]; action.tag = bossAction1; [sprite runAction:action];

}

//アクション1を行っているかどうかをこれで取得できる。 -(BOOL) isAttack1 { return ([sprite getActionByTag:bossAction1] != nil); }

[/c]

これを使えば「羽を震わせているときだけ、攻撃が当たる」が実装できました。

ここ2日でできたもの

動画があまりうまく撮れていません。まだまだ改善の余地あります。

最後に

ボスとの戦闘ですべて終わりでなく、通常この後に宝箱が出てきたりと何かイベントがあるはずです。この実装方法についてはある程度こうすればいいのかなと思うところはありますが、今日中に実装はできませんでした。 このボスとの戦いがRPGやアクションゲームでもっともテンションが上がる部分だと思いますので、ユーザーをがっかりさせないためにも細かいところまで気を配っていきたいです。