書いてあるコードのうまくいっていない部分は
まず、if(t%700 > 550)ではboss_shot.bullet
.angleが
1フレームごとに更新されてしまうのでif(t%700==550)に変更する。
boss_shot.bullet.angle=atan2(boss_shot.bullet.y-ch.y,boss_shot.bullet.x-ch.x)
atan2(y,x)はx軸正の方向とベクトル(x,y)の方向がなす角度を返すので、
これでは角度が自機から弾への方向になってしまい、弾が自機から遠ざかるように動いてしまう。
そのため、引数をch.y-boss_shot.bullet.y,ch.x-boss_shot.bullet.xに変更すればよい。
boss_shot.bullet.angle=bossatan3(i,ch.x,ch.y);とかいてもよい。
あと、弾幕のコードを書いてみました。
一つ目はアシストに自機を追尾させながら弾を置き、
配置された弾は置かれて一定時間後に自機の方向に飛んでくる弾幕で、
二つ目はパルシィの「丑の刻参り」のような弾幕です。
//弾発射用関数
void boss_bullet_on(int way,int knd,int col,double x,double y,double b_angle,double d_angle,double spd,int state,int till,int eff=0,int sflag=1){
int i,k;
for(i=0;i<way;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].knd = knd;//弾の種類
if(knd==7) boss_shot.bullet[k].kaiten=1;
else boss_shot.bullet[k].kaiten=0;
boss_shot.bullet[k].col = col;//弾の色
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].x = x;//座標
boss_shot.bullet[k].y = y;
boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
boss_shot.bullet[k].spd = spd;//スピード
boss_shot.bullet[k].state = state;//弾の状態
boss_shot.bullet[k].till = till;//弾が画面外に出ても消えない時間
boss_shot.bullet[k].eff = eff;
if(sflag==1)se_flag[0]=1;
}
}
}
void boss_shot_bulletT062(){
int i,t=boss_shot.cnt;
//アシストを出す
if(t==0){
boss_shot.assist[0].flag = 1;
boss_shot.assist[0].cnt = 0;
boss_shot.assist[0].knd = 0;
boss_shot.assist[0].col = 0;
boss_shot.assist[0].x = 0;
boss_shot.assist[0].y = 0;
boss_shot.assist[0].angle = 0;
boss_shot.assist[0].spd = 2.5;
boss_shot.assist[0].state = 0;
boss_shot.assist[0].till = 0;
boss_shot.assist[0].eff = 0;
se_flag[0]=1;
}
//アシストは常に自機を追いながら弾を配置する
boss_shot.assist[0].angle=atan2(ch.y-boss_shot.assist[0].y,ch.x-boss_shot.assist[0].x);
if(t%5==0){
boss_bullet_on(1,1,1,boss_shot.assist[0].x+rang(64),boss_shot.assist[0].y+rang(64),0,0,0,1,0);
boss_bullet_on(1,7,0,boss_shot.assist[0].x+rang(64),boss_shot.assist[0].y+rang(64),0,0,0,1,0);
}
for(i=0;i<BOSS_BULLET_MAX;i++){
//配置された弾は一定時間後に自機の方向に動き出す
if(boss_shot.bullet.flag==1 && boss_shot.bullet.state==1){
if(boss_shot.bullet.cnt==300){
boss_shot.bullet[i].angle=bossatan3(i,ch.x,ch.y);
}
if(boss_shot.bullet[i].cnt>=300 && boss_shot.bullet[i].cnt<360){
boss_shot.bullet[i].spd+=0.05;
}
if(boss_shot.bullet[i].cnt==360) boss_shot.bullet[i].state=0;
}
}
}
void boss_shot_bulletT063(){
int i,t=boss_shot.cnt%150;
if(boss_shot.cnt==0) input_phy_pos(FMX/2,FMY/2,30);
//角度を記憶させる
if(t==30) boss_shot.base_angle[0]=bossatan2();
if(t>=30 && t<150 && t%8==0){
for(i=0;i<6;i++){
boss_bullet_on(1,8,4,boss.x,boss.y,boss_shot.base_angle[0]+i*PI2/6+rang(PI/24),0,2,1,0);
}
}
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet[i].flag>0 && boss_shot.bullet[i].state==1){
boss_shot.bullet[i].spd+=0.02;
//画面枠についたら新しく弾を発射し、消去する
if(boss_shot.bullet[i].x<0 || boss_shot.bullet[i].x>FMX || boss_shot.bullet[i].y<0 || boss_shot.bullet[i].y>FMY){
boss_bullet_on(1,1,2,boss_shot.bullet[i].x,boss_shot.bullet[i].y,bossatan3(i,boss.x,boss.y)+rang(PI/4),0,1,0,0,1,0);
boss_shot.bullet[i].flag=0;
}
}
}
}