southです。
読解不足でした。
ドクダミ茶さんがどのようなグレイズカウントアップ処理を組んだのか分らないので使えるのかわかりませんが
60章のプロジェクトをベースにグレイズ判定を追加してみました。
色強調ができなかったので追加位置に全角の「!」入れてるので確認後消してください。
ボスが出現して初めの弾幕にしかboss_shot.bullet[k].graze = 1;を追加していないので他はグレイズ判定は行われません。
確認する場合は、ボスが出現するまで進めてください。
bullet_t構造体にgraze判定用の変数を追加
struct.h // 61行目付近
コード:
//弾に関する構造体
typedef struct{
//フラグ、種類、カウンタ、色、状態、少なくとも消さない時間、エフェクトの種類
int flag,knd,cnt,col,state,till,eff,kaiten,eff_detail;
int cnt_till,cnt_stt;
//座標、角度、速度、ベースの角度、一時記憶スピード
double x,y,vx,vy,angle,spd,base_angle[1],rem_spd[1];
int c_flag;
double cx,cy;
! int graze;
}bullet_t;
弾幕を登録する際にグレイズ判定を初期化
boss_shotH.cpp // 13行目付近
コード:
void boss_shot_bulletH000(){
#define TM000 120
int i,k,t=boss_shot.cnt%TM000,t2=boss_shot.cnt;
double angle;
//60カウント以下で10カウントに1回
if(t<60 && t%10==0){
angle=bossatan2();//自機とボスとの成す角
for(i=0;i<30;i++){
if((k=search_boss_shot())!=-1){
boss_shot.bullet[k].col = 0;//弾の色
boss_shot.bullet[k].x = boss.x;//座標
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 8;//弾の種類
boss_shot.bullet[k].angle = angle+PI2/30*i;//角度
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 3;//スピード
! boss_shot.bullet[k].graze = 1;
se_flag[0]=1;
}
}
}
// for(i=0;i<BOSS_BULLET_MAX;i++){
// if(boss_shot.bullet[i].flag>0){
//
// }
// }
}
グレイズ判定用の関数(弾の当たり判定+ 5.0fがかすり判定)
out.cpp // 93行目付近
コード:
!int out_judge_bossshot_graze(int n){
! if(boss_shot.bullet[n].cnt>0 && boss_shot.bullet[n].graze != 0){//ショットの軌道が1度でも計算されていたら
! if(out_judge(
! boss_shot.bullet[n].x,boss_shot.bullet[n].y,ch.x,ch.y,
! bullet_info[boss_shot.bullet[n].knd].range + 5.0f,CRANGE,
! boss_shot.bullet[n].spd,boss_shot.bullet[n].angle
! )){
! return 1;
! }
! }
! return 0;
!}
int serch_item(){
for(int i=0;i<ITEM_MAX;i++)
if(item[i].flag==0)
return i;
return -1;
}
かすり判定を実際に行ってかすっていた時の処理を追加
out.cpp // 210行目付近
コード:
//敵ショットと自機との処理
void enemyshot_and_ch(){
int s,n;
if(ch.flag==0 && ch.mutekicnt==0 && out_lazer()==1){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
//雑魚敵のショット
for(s=0;s<SHOT_MAX;s++){//敵ショット総数
if(shot[s].flag>0){//そのショットが登録されていたら
for(n=0;n<SHOT_BULLET_MAX;n++){//弾総数
if(shot[s].bullet[n].flag==1){//弾が登録されていたら
if(bom.flag!=0){
shot[s].bullet[n].flag=0;
continue;
}
if(out_judge_enemyshot(s,n)==1){//自機にその弾が接触していたら
shot[s].bullet[n].flag=0;//弾をオフ
if(ch.flag==0 && ch.mutekicnt==0){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
}
}
}
}
}
//ボスのショット
if(boss_shot.flag>0){//そのショットが登録されていたら
for(n=0;n<BOSS_BULLET_MAX;n++){//弾総数
if(boss_shot.bullet[n].flag==1){//弾が登録されていたら
if(bom.flag!=0){
boss_shot.bullet[n].flag=0;
continue;
}
if(out_judge_bossshot(n)==1){//自機にその弾が接触していたら
boss_shot.bullet[n].flag=0;//弾をオフ
if(ch.flag==0 && ch.mutekicnt==0){
ch.cnt=0;
ch.flag=1;
se_flag[3]=1;
}
}
! if(out_judge_bossshot_graze(n)==1){//自機にその弾がかすっていたら
! boss_shot.bullet[n].graze = 0; //かすり判定OFF
! printfDx("かすった!");// ここにカウントアップ処理を追加
! }
}
}
}
}