またもボス弾幕関連の質問なのですが・・・
今回はレーザーを次々に撃たせる方法について知りたくて質問させてもらいまいた。
図のように、
前に撃ったレーザーがまだ残っている間に次のレーザーを撃つ,
ということをしたいのです。例えば、
//レーザー発射関数です
int lazer_way( double x , double y , int way , double wayangle , double angle , int length , int haba , int hantei , int col , int flag , int state){
int i,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
if((k=search_lazer())!=-1){
lazer[k].startpt.x = x;
lazer[k].startpt.y = y;
lazer[k].length = length;
lazer[k].haba = haba;
lazer[k].hantei = hantei;
lazer[k].col = col;
lazer[k].flag = flag;
lazer[k].angle = angle-wayangle*(way/2)+wayangle*i;
lazer[k].state = state;
lazer[k].knd = 0;
lazer[k].cnt = 0;
}
}
}
return k;
}
void boss_shot_bulletH025(){
int i,k,t=boss_shot.cnt%120;
if(t==0)lazer_way(0+100 ,100,8,PI2/8 ,PI/2+rang(PI2/16),400,1,0,0,1,0);
if(t==40)lazer_way(FMX-100,100,8,PI2/8,PI/2+rang(PI2/16),400,1,0,1,1,1);
for(i=0;i<LAZER_MAX;i++){
if(lazer.state==0){
if(t==20){
lazer.haba=20;
lazer.hantei=0.8;
}
if(t>30 && t<=70)lazer.haba-=0.5;
if(t==70)lazer.flag=0;
}
}
for(k=0;k<LAZER_MAX;k++){
if(lazer[k].state==1){
if(t==60){
lazer[k].haba=20;
lazer[k].hantei=0.8;
}
if(t>70 && t<=110)lazer[k].haba-=0.5;
if(t==110)lazer[k].flag=0;
}
}
}のような感じです。
しかし、
この弾幕は問題なく動作するのですが、次のような弾幕を作ったときに、
明らかに自機はレーザーに触れていないのにもかかわらず、自機が被弾する、
という現象が起きてしまい困っています・・
被弾しないときもあるのですが、大抵の場合被弾します(レーザーの方向がまちまちになる時はほとんどといってもいい程です)
それと、わざわざ引数を複数使ってレーザーを撃つのも効率が悪い気がします・・・
ほかに良い方法はないでしょうか?
昨日から考えているのですが、自分ではどうにも解決できなさそうです・・・
アドバイスよろしくお願いしますm()m
void boss_shot_bulletH026(){
int k,l,t=boss_shot.cnt%800;
if(t==130 || t==200 || t==270 || t==340 || t==410)input_phy_pos(ch.x,FMY/2+rang(FMY/4),60);
if(t==500)input_phy_pos(FMX/2,100,80);
if(t==190)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,0);
if(t==260)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,0,1,1);
if(t==330)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,2);
if(t==400)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,0,1,3);
if(t==470)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,4);
for(k=0;k<LAZER_MAX;k++){
if(lazer[k].state==0){
if(t==700){
lazer[k].haba=20;
lazer[k].hantei=0.8;
}
if(t>700 && t<=710)lazer[k].haba-=2;
if(t==711)lazer[k].flag=0;
}
}
for(l=0;l<LAZER_MAX;l++){
if(lazer[[/url].state==1){
if(t==707){
lazer[[/url].haba=20;
lazer[[/url].hantei=0.8;
}
if(t>707 && t<=717)lazer[[/url].haba-=2;
if(t==718)lazer[[/url].flag=0;
}
}
for(k=0;k<LAZER_MAX;k++){
if(lazer[k].state==2){
if(t==714){
lazer[k].haba=20;
lazer[k].hantei=0.8;
}
if(t>714 && t<=724)lazer[k].haba-=2;
if(t==725)lazer[k].flag=0;
}
}
for(l=0;l<LAZER_MAX;l++){
if(lazer[[/url].state==3){
if(t==721){
lazer[[/url].haba=20;
lazer[[/url].hantei=0.8;
}
if(t>721 && t<=731)lazer[[/url].haba-=2;
if(t==732)lazer[[/url].flag=0;
}
}
for(k=0;k<LAZER_MAX;k++){
if(lazer[k].state==4){
if(t==728){
lazer[k].haba=20;
lazer[k].hantei=0.8;
}
if(t>728 && t<=738)lazer[k].haba-=2;
if(t==739)lazer[k].flag=0;
}
}
} 