太鼓の鉄人のヒットの登録処理を一度に全部しない理由
Posted: 2017年11月06日(月) 16:41
//ヒットしたかどうかを判定する
void hit_bullet(){
int i,j,k,knd;
double x,pre_x,x0,x1;
double line_x[3]={PERFECT_X,GOOD_X,BOO_X};
hit_dat_t hit_dat[HIT_DAT_MAX];
memset(hit_dat,0,sizeof(hit_dat_t)*HIT_DAT_MAX);
for(i=0;i<BULLET_MAX;i++){//弾分ループ
if(bullet[i].flag==1){//弾が存在していて
knd=-1;
pre_x=bullet[i].x+bullet[i].spd;
x=bullet[i].x;
for(j=0;j<3;j++){
x0=HIT_X-line_x[j];
x1=HIT_X+line_x[j];
if(x<x0 && x0<pre_x || x<x1 && x1<pre_x || x0<x && x<x1 || x0<pre_x && pre_x<x1){//距離ヒット以内なら
knd=j;
break;
}
}
//距離OKでその時たたいていたら
if(knd!=-1 && (ch.don==1 && bullet[i].knd==0 || bullet[i].knd==1 && ch.ka==1)){
if((k=serch_hit_dat(hit_dat))!=-1){
enter_hit_dat(k,i,knd,bullet[i].x,hit_dat);
}
}
}
}
int num=0;
for(i=0;i<HIT_DAT_MAX;i++){//ヒットした分
if(hit_dat[i].flag==1){//数える
num++;
}
}
if(num>0){//ヒットしたもんがあったら
/*ここでヒットしたデータをkndごとにソートする*/
/*今回はここは省略し、単にHIT_Xに近い物をヒットとする*/
for (i = 0; i < num - 1; i++) {
for (j = i + 1; j < num; j++) {
if (fabs(hit_dat[i].x-HIT_X) > fabs(hit_dat[j].x-HIT_X)) {
hit_dat_t t;
t=hit_dat[i]; hit_dat[i]=hit_dat[j]; hit_dat[j]=t;
}
}
}
i=hit_dat[0].id; knd=hit_dat[0].knd; x=hit_dat[0].x;
//登録処理
if((k=serch_kekka())!=-1){
enter_kekka(k,knd,x,HIT_Y-40);
add_score(knd);
}
bullet[i].flag=0;
}
//効果音を鳴らす
if(ch.don==1)
se_flag[0]=1;
if(ch.ka==1)
se_flag[1]=1;
}