前回までにしっかりとモジュール作りをしておいたので、弾幕の追加が楽ですね。
今度は弾幕関数だけ変更すればいいです。
shot_bullet_H008にミシャグジさま弾幕を実装しましょう。
ミシャグジさま弾幕は東方風神録EXのラスト弾幕のことです。よく知らない人は動画で確認して下さい。
http://www.nicovideo.jp/search/%E3%83%9F%E3%82%B7%E3%83%A3%E3%82%B0%E3%82%B8%E3%81%95%E3%81%BE?sort=v |
案外EXのラスト弾幕のわりには結構簡単に実装出来る・・・というとファンの方から怒られるかもしれませんが、
結構簡単に似せる事が出来ます。
---- shotH.cppに以下を追加 ---- //ミシャグジさま void shot_bullet_H008(int n){ int t=shot[n].cnt; int k; if(t>=0 && t<1200 && t%90==0){ double angle=rang(PI); for(int j=0;j<2;j++){//途中から2分裂する分 for(int i=0;i<60;i++){//一度に60個 if(shot[n].flag!=2 && (k=shot_search(n))!=-1){ shot[n].bullet[k].knd =8;//8番の弾 shot[n].bullet[k].angle =angle+PI2/60*i;//円形60個 shot[n].bullet[k].flag =1; shot[n].bullet[k].x =enemy[shot[n].num].x; shot[n].bullet[k].y =enemy[shot[n].num].y; shot[n].bullet[k].col =4;//4番の色 shot[n].bullet[k].cnt =0; shot[n].bullet[k].state =j;//ステータス。0か1かで回転がかわる shot[n].bullet[k].spd =2; } } } se_flag[0]=1;//発射音鳴らす } for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分 if(shot[n].bullet[i].flag>0){//登録されている弾があれば int state=shot[n].bullet[i].state; int cnt=shot[n].bullet[i].cnt; if(30<cnt && cnt<120){//30〜120カウントなら shot[n].bullet[i].spd-=1.2/90.0;//90カウントかけて1.2減らす shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);//90カウントかけて90°傾ける } } } }
弾の番号はbulletフォルダにある弾の番号と同じなので確認しておいて下さい。
(b8.png)
一番左を0番とすると、色番号1番が水色なので、色は1を指定します。
ここでstateに0か1を渡しています。ミシャグジさま弾幕は1箇所から2つずつ弾が発射されており、
途中から2つの軌道がかわります。
そこで、0を指定した弾は角度が正の方向に変わり、1を指定した弾は逆・・としてみます。
shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);
これがその代入です。クエッションマークは条件演算子です。わからない方はググって下さい。
こうすることで、2種類の角度に分けることが出来ます。
/カウンタ | 移動パターン | 敵の種類 | 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 | 8 | 1 | 100 | 0 | 1200 | 0 | -1 | -1 | -1 | -1 | -1 |
実行結果
- Remical Soft -