そのコードですと配列に格納されている順番(j)で描画されてしまいます。
(例えばj=100の時にboss_shot.bullet[j].knd==6を満たして、次のj=101の時にboss_shot.bullet[j].knd==10を満たしても、結局knd=10の方が後で描かれるため前回の上に描かれてしまいます)
そこで私は描画直前に弾の構造体の中身をソートする関数を挟んでいます。
龍神録のサンプルのままですと、jの値が小さければ下に描かれますので、
優先的に下に描きたい弾情報と若い値のjに入っている弾情報を交換する感じです。
私の場合とりあえず1種類の弾だけですが、
//弾情報ソート
void bullet_sort(){
int i;
static int n;
//ソート元情報保存用変数
float smx,smy,smangle,smspd;
int smflag,smcnt,smstate,smknd,smcol,smeff,smeff_detail;
//ソート先情報保存用変数
float ssx,ssy,ssangle,ssspd;
int ssflag,sscnt,ssstate,ssknd,sscol,sseff,sseff_detail;
for(i=0;i<BOSS_BULLET_MAX;i++){
if(boss_shot.bullet.knd==10){//もし弾の種類が10だったら
//元の弾情報保存
smx=boss_shot.bullet.x;
smy=boss_shot.bullet.y;
smangle=boss_shot.bullet.angle;
smspd=boss_shot.bullet.spd;
smflag=boss_shot.bullet.flag;
smcnt=boss_shot.bullet.cnt;
smstate=boss_shot.bullet.state;
smknd=boss_shot.bullet.knd;
smcol=boss_shot.bullet.col;
smeff=boss_shot.bullet[i].eff;
smeff_detail=boss_shot.bullet[i].eff_detail;
//ソート先の弾情報保存
ssx=boss_shot.bullet[n].x;
ssy=boss_shot.bullet[n].y;
ssangle=boss_shot.bullet[n].angle;
ssspd=boss_shot.bullet[n].spd;
ssflag=boss_shot.bullet[n].flag;
sscnt=boss_shot.bullet[n].cnt;
ssstate=boss_shot.bullet[n].state;
ssknd=boss_shot.bullet[n].knd;
sscol=boss_shot.bullet[n].col;
sseff=boss_shot.bullet[n].eff;
sseff_detail=boss_shot.bullet[n].eff_detail;
//弾情報を交換する
//ソート1
boss_shot.bullet[n].x=smx;
boss_shot.bullet[n].y=smy;
boss_shot.bullet[n].angle=smangle;
boss_shot.bullet[n].spd=smspd;
boss_shot.bullet[n].flag=smflag;
boss_shot.bullet[n].cnt=smcnt;
boss_shot.bullet[n].state=smstate;
boss_shot.bullet[n].knd=smknd;
boss_shot.bullet[n].col=smcol;
boss_shot.bullet[n].eff=smeff;
boss_shot.bullet[n].eff_detail=smeff_detail;
//ソート2
boss_shot.bullet[i].x=ssx;
boss_shot.bullet[i].y=ssy;
boss_shot.bullet[i].angle=ssangle;
boss_shot.bullet[i].spd=ssspd;
boss_shot.bullet[i].flag=ssflag;
boss_shot.bullet[i].cnt=sscnt;
boss_shot.bullet[i].state=ssstate;
boss_shot.bullet[i].knd=ssknd;
boss_shot.bullet[i].col=sscol;
boss_shot.bullet[i].eff=sseff;
boss_shot.bullet[i].eff_detail=sseff_detail;
n++;//nをひとつ進める
}
}
n=0;
}
こんな感じでやっています。
flagを加えてちょっと改変すれば数種類の弾ソートも可能だと思います。
もっと良い方法があると思いますので参考までに…
あとここからは蛇足なのですが弾の描画順ということで、連なって描かれる弾を綺麗に描画する方法があります。
おそらくサンプルのままだと、連なる弾の重なり方は時間が経つと添付画像の上のようにバラバラになると思います。これは弾の検索を毎回0~BOSS_BULLET_MAX全て調べているため、画面外に行ったなどしてフラグが空いた弾が若い値のjの場合、その値から優先的に弾を作ってしまうからです。
そこで、空いてる弾の検索でフラグが立っていない弾のインデックスを保存し、次に検索する時は前回+1から空き弾を検索することで下の画像にように割と綺麗にできます。
search_boss_shotを
int search_boss_shot(){//空き番号を返す
int i,b_num;
if(b_num>=BOSS_BULLET_MAX)b_num=0;
for(i=b_num;i<BOSS_BULLET_MAX-100;i++){
if(boss_shot.bullet[i].flag==0){
b_num=i+1;
return i;
}
}
return -1;
}
という感じです。
たまにおかしくなりますが結構いけますw