え、タイトルがおかしい? 気にしない。

さて、基本的な弾幕の作り方がわかったところで、少し複雑な弾幕を作っていきましょう。

といっても、突然複雑になるとわかりにくいので、まず簡単な弾幕から。

今回はまず、さきに実行結果を見てみましょう。

実行結果


正確にはみょんの弾幕とは少し違いますが、そっくりにしようとすると計算式が複雑になるので簡略化しました。

このような弾を撃つにはどうしたらいいでしょうか?

発射地点が敵のいる位置を中心に円形に回転しながら移動していますね?

下から上へ半回転しています。

これは敵がいる位置からPI/2の位置からPI/2+PIの方向とPI/2-PIの方向へ回転していますね?

今回はこれを150カウントのうち15回のショットで表現してみます。


---- shotH.cppに以下を追加 ----


//みょん弾幕
void shot_bullet_H007(int n){
        int t=shot[n].cnt;
        int k;
        if(t>=0 && t<=150 && t%10==0){
                for(int i=0;i<20;i++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                                shot[n].bullet[k].knd   =7;
                                shot[n].bullet[k].angle =PI2/20*i;
                                shot[n].bullet[k].flag  =1;
                                shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
                                shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
                                shot[n].bullet[k].col   =2;
                                shot[n].bullet[k].cnt   =0;
                                shot[n].bullet[k].spd   =1.2;
                        }
                }
                for(int i=0;i<20;i++){
                        if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                                shot[n].bullet[k].knd   =7;
                                shot[n].bullet[k].angle =PI2/20*i;
                                shot[n].bullet[k].flag  =1;
                                shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
                                shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
                                shot[n].bullet[k].col   =4;
                                shot[n].bullet[k].cnt   =0;
                                shot[n].bullet[k].spd   =1.2;
                                se_flag[0]=1;
                        }
                }
        }
}


cos(PI/2+PI/150*t)*100;

となっているcosはx成分を0〜1の範囲で計算しており、それに円の半径である100をかけています。

円の大きさを変えたいときはこの100を調整しましょう。


そして何回も宣言や定義を変更するのが面倒なので、18個弾幕を先に宣言しておきましょう。


---- shotH.cppに以下を追加 ----

void shot_bullet_H008(int n){}
void shot_bullet_H009(int n){}
void shot_bullet_H010(int n){}
void shot_bullet_H011(int n){}
void shot_bullet_H012(int n){}
void shot_bullet_H013(int n){}
void shot_bullet_H014(int n){}
void shot_bullet_H015(int n){}
void shot_bullet_H016(int n){}
void shot_bullet_H017(int n){}


---- shot.cpp の任意の箇所を以下に変更 ----

extern void shot_bullet_H000(int);extern void shot_bullet_H001(int);extern void shot_bullet_H002(int);
extern void shot_bullet_H003(int);extern void shot_bullet_H004(int);extern void shot_bullet_H005(int);
extern void shot_bullet_H006(int);extern void shot_bullet_H007(int);extern void shot_bullet_H008(int);
extern void shot_bullet_H009(int);extern void shot_bullet_H010(int);extern void shot_bullet_H011(int);
extern void shot_bullet_H012(int);extern void shot_bullet_H013(int);extern void shot_bullet_H014(int);
extern void shot_bullet_H015(int);extern void shot_bullet_H016(int);extern void shot_bullet_H017(int);

void (*shot_bullet[SHOT_KND_MAX])(int) ={
        shot_bullet_H000,shot_bullet_H001,shot_bullet_H002,shot_bullet_H003,shot_bullet_H004,
        shot_bullet_H005,shot_bullet_H006,shot_bullet_H007,shot_bullet_H008,shot_bullet_H009,
        shot_bullet_H010,shot_bullet_H011,shot_bullet_H012,shot_bullet_H013,shot_bullet_H014,
        shot_bullet_H015,shot_bullet_H016,shot_bullet_H017,
};


---- define.h の定義を以下のように変更 ----

#define SHOT_KND_MAX 18


エクセルデータの変更箇所です。

これから弾幕の番号が変わっていくので「弾幕種類」の番号を一つずつ増やして行って下さい。

/カウンタ 移動パターン 敵の種類 x座標 y座標 スピード 発射時間 弾幕種類 弾の色 体力 弾種類 待機時間 アイテム1 2 3 4 5 6
/cnt pattern knd x y sp bltime blknd col hp blknd2 wait item_n
60 9 0 200 150 0 60 7 0 100 0 200 0 -1 -1 -1 -1 -1


エクセルデータのダウンロード





- Remical Soft -