耐久弾幕を作るには
Posted: 2010年1月07日(木) 00:04
現在ボス弾幕を制作中なのですが、東方などでみられる『耐久弾幕』の実装についてで分からないことがあったので質問させてください。
耐久弾幕というのは、
ボスに弾を当てて体力をけずるのではなく、一定時間弾幕を避けきることを目的とした弾幕
・・・のことです。(解釈がまちがっているかもしれませんが・・・)
この種類の弾幕を実装するためには、最低でも、
ボスの弾幕中であっても、
・自機ショットとボスの当たり判定
・自機とボスの当たり判定
をなくす
ことが必要だと考えました。
そこで、一番目の「自機のショットとボスの当たり判定を消す」処理から書いていこうと思ったのですが、
ホーミング弾がボスに吸いついたようになったまま消えない
という現象が起きてしまいました・・・
添付ファイルのような感じです。
cshot.cppに何か処理を加えてあげれば良さそうなのですが、どのような処理を追加するのが最善の方法なのでしょうか・・・
アドバイスよろしくお願いします。
____以下は追加した部分です____
・struct.h内のボスの構造体に、耐久弾幕かどうかのフラグ、
s_flagを追加(1なら耐久)
・out.cppの赤文字部分を追加
・graph.cppの赤文字部分を追加
・boss_shot.cpp内の赤文字部分を追加
・弾幕関数内で、
boss.s_flag=1;
とする
________________________________________
耐久弾幕というのは、
ボスに弾を当てて体力をけずるのではなく、一定時間弾幕を避けきることを目的とした弾幕
・・・のことです。(解釈がまちがっているかもしれませんが・・・)
この種類の弾幕を実装するためには、最低でも、
ボスの弾幕中であっても、
・自機ショットとボスの当たり判定
・自機とボスの当たり判定
をなくす
ことが必要だと考えました。
そこで、一番目の「自機のショットとボスの当たり判定を消す」処理から書いていこうと思ったのですが、
ホーミング弾がボスに吸いついたようになったまま消えない
という現象が起きてしまいました・・・
添付ファイルのような感じです。
cshot.cppに何か処理を加えてあげれば良さそうなのですが、どのような処理を追加するのが最善の方法なのでしょうか・・・
アドバイスよろしくお願いします。
____以下は追加した部分です____
・struct.h内のボスの構造体に、耐久弾幕かどうかのフラグ、
s_flagを追加(1なら耐久)
・out.cppの赤文字部分を追加
int out_judge_cshot_boss(int i){
if(cshot.cnt>0){//ショットの軌道が1度でも計算されていたら
if(boss.s_flag==0){
if(out_judge(cshot.x,cshot.y,boss.x,boss.y,
cshot_range[cshot.knd],BRANGE,cshot.spd,cshot.angle)){
return 1;
}
}
}
return 0;
}・graph.cppの赤文字部分を追加
void graph_boss(){
int i;
if(boss.flag==0)return;
if(boss.s_flag==0){
graph_boss_effect();
DrawRotaGraphF(boss.dx+FX+dn.x,boss.dy+FY+dn.y,
1.0f,0.0f,img_dot_riria[0],TRUE);
}
if(boss.hp_max==0){printfDx("graph_boss内0割り\n");return;}
for(i=0;i<FMX*0.98*boss.hp/boss.hp_max;i++){
if(boss.back_knd[boss.knd]==1)
DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[7],FALSE);
else
DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[1],FALSE);
}
}・boss_shot.cpp内の赤文字部分を追加
void enter_boss(int num){
if(num==0){//中ボス開始時の時は
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//雑魚敵を消す
memset(shot,0,sizeof(shot_t)*SHOT_MAX);//弾幕を消す
boss.x=FMX/2;//ボスの初期座標
boss.y=-30;
if(stage_count==boss.appear_count[0])//最初なら
boss.knd=-1;//弾幕の種類
}
boss.phy.flag=1;
boss.phy.flag=1;
boss.s_flag=0;
boss.flag=1;
boss.hagoromo=0;//扇を広げるかどうかのフラグ
boss.endtime=99*60;//残り時間
boss.state=1;//待機中状態に
boss.cnt=0;
boss.graph_flag=0;//描画フラグを戻す
boss.knd++;
boss.wtime=0;//待機時間を初期化
input_phy(60);//60カウントかけて物理的計算で定位置に戻す
}・弾幕関数内で、
boss.s_flag=1;
とする
________________________________________
