ホーミングと言っても必ずあたるわけではなく、敵弾の角度とキャラクターの座標を照らし合わせてアングル値に変化を少しづつ加えるというものです。
キャラクターのオプションがもっているホーミング関数を分解して(関数の引数と帰り値の用途がよく理解できなかったため)敵とキャラの立場を総取替えしました。
下記のソースは、それぞれ誘導性能をつけたいshotH.cppの弾幕関数shot_bullet_H001(int n)などの終わりのほうに記入してあります。
「問題点は、敵が弾を撃ってくれない」ということです。
うんともすんともいいません。
for(int i=0;i<SHOT_BULLET_MAX;i++){
if(shot[n].bullet[k].flag==1){
int dranx=(int)(shot[n].bullet[k].spd+11/2),drany=(int)(shot[n].bullet[k].spd+55/2);
if(shot[n].bullet[k].knd==1){
double x,y,l_a,l_b;
x=ch.x-shot[n].bullet[k].x;
y=ch.y-shot[n].bullet[k].y;
l_a = (2*PI)/(30); //一定の角度(曲がる)
l_b = atan2(y,x) - shot[n].bullet[k].angle; //敵への角度-弾の角度
if(cos(l_b) > cos(l_a)){ //もしも「弾の進行方向と敵への角度の差」が「曲がる角度」より大きかったら
shot[n].bullet[k].angle=atan2(y,x); //敵への角度を弾の角度へ代入
}else if(sin(l_b)>0){ //弾の正面ではなく右寄りならば
shot[n].bullet[k].angle += l_a; //弾の角度に左向きに修正(angleに一定値を足す)
}else if(sin(l_b)<0){ //弾の正面ではなく左寄りならば
shot[n].bullet[k].angle -= l_a; //弾の角度に右向きに修正(angleから一定値を引く)
}else{ //弾が正面ならば引き続き誘導
shot[n].bullet[k].angle=atan2(y,x);
}
}
shot[n].bullet[k].x+=cos(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
shot[n].bullet[k].y+=sin(shot[n].bullet[k].angle)*shot[n].bullet[k].spd;
shot[n].bullet[k].cnt++;
shot[n].bullet[k].flag=0;
}
}