耐久弾幕を作るには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yrao

耐久弾幕を作るには

#1

投稿記事 by yrao » 15年前

現在ボス弾幕を制作中なのですが、東方などでみられる『耐久弾幕』の実装についてで分からないことがあったので質問させてください。
 
耐久弾幕というのは、
ボスに弾を当てて体力をけずるのではなく、一定時間弾幕を避けきることを目的とした弾幕
・・・のことです。(解釈がまちがっているかもしれませんが・・・)
 
 
この種類の弾幕を実装するためには、最低でも、
   ボスの弾幕中であっても、
   ・自機ショットとボスの当たり判定
   ・自機とボスの当たり判定
   をなくす
ことが必要だと考えました。
 
そこで、一番目の「自機のショットとボスの当たり判定を消す」処理から書いていこうと思ったのですが、
ホーミング弾がボスに吸いついたようになったまま消えない
という現象が起きてしまいました・・・
添付ファイルのような感じです。
 
cshot.cppに何か処理を加えてあげれば良さそうなのですが、どのような処理を追加するのが最善の方法なのでしょうか・・・
アドバイスよろしくお願いします。
 
 
____以下は追加した部分です____



・struct.h内のボスの構造体に、耐久弾幕かどうかのフラグ、
s_flagを追加(1なら耐久)


・out.cppの赤文字部分を追加
 
int out_judge_cshot_boss(int i){
    if(cshot.cnt>0){//ショットの軌道が1度でも計算されていたら
        if(boss.s_flag==0){             
             if(out_judge(cshot.x,cshot.y,boss.x,boss.y,
                    cshot_range[cshot.knd],BRANGE,cshot.spd,cshot.angle)){
                    return 1;
             }
        }
    }
    return 0;
}

 





・graph.cppの赤文字部分を追加

void graph_boss(){
    int i;
    if(boss.flag==0)return;
    if(boss.s_flag==0){        
         graph_boss_effect();
        DrawRotaGraphF(boss.dx+FX+dn.x,boss.dy+FY+dn.y,
            1.0f,0.0f,img_dot_riria[0],TRUE);
    }
    if(boss.hp_max==0){printfDx("graph_boss内0割り\n");return;}
    for(i=0;i<FMX*0.98*boss.hp/boss.hp_max;i++){
        if(boss.back_knd[boss.knd]==1)
            DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[7],FALSE);
        else
            DrawGraph(3+FX+i+dn.x,2+FY+dn.y,img_etc[1],FALSE);
    }
}



・boss_shot.cpp内の赤文字部分を追加

void enter_boss(int num){
    if(num==0){//中ボス開始時の時は
        memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);//雑魚敵を消す
        memset(shot,0,sizeof(shot_t)*SHOT_MAX);//弾幕を消す
        boss.x=FMX/2;//ボスの初期座標
        boss.y=-30;
        if(stage_count==boss.appear_count[0])//最初なら
            boss.knd=-1;//弾幕の種類
    }
    boss.phy.flag=1;
    boss.phy.flag=1;
    boss.s_flag=0;    
     boss.flag=1;
    boss.hagoromo=0;//扇を広げるかどうかのフラグ
    boss.endtime=99*60;//残り時間
    boss.state=1;//待機中状態に
    boss.cnt=0;
    boss.graph_flag=0;//描画フラグを戻す
    boss.knd++;
    boss.wtime=0;//待機時間を初期化
    input_phy(60);//60カウントかけて物理的計算で定位置に戻す
}




・弾幕関数内で、
boss.s_flag=1;
とする



________________________________________

あ~る

Re:耐久弾幕を作るには

#2

投稿記事 by あ~る » 15年前

どうやってホーミングさせているかはわかりますよね?
s_flagが1の時にその処理を呼ばない、またはs_flagが0の時にのみその処理を呼べばOKのはずです
画像

SooA

Re:耐久弾幕を作るには

#3

投稿記事 by SooA » 15年前

//自機ショットと敵との処理
void cshot_and_enemy(){
    int i,s;
    for(i=0;i<CSHOT_MAX;i++){//自機ショット総数
        if(cshot.flag>0){
            for(s=0;s<ENEMY_MAX;s++){//敵総数
                if(enemy.flag>0){
                    if(out_judge_cshot(i,s)){//自機ショットと敵が当たっていれば
                        cshot.flag=0;//その自機ショットを消す
                        hit_enemy(s,cshot.power);
                        break;
                    }
                }
            }
            //ボスが出現していて、描画しないフラグがオフで、ショット中なら
            if(boss.flag==1 && boss.graph_flag==0 && boss.state==2){
                if(out_judge_cshot_boss(i)){
                    cshot.flag=0;
                    hit_boss(cshot.power);
                }
            }
        }
    }
}

龍神禄プログラムの60章のプロジェクトから
out.cpp 内の赤色の行をコメントアウトして
テストプレイしてみましょう。

yrao

Re:耐久弾幕を作るには

#4

投稿記事 by yrao » 15年前

あ~るさん、SooAさん、どうもありがとうございます。
 


不具合ですが、
//一番近い敵を探して角度をセットする
void calc_homing(int k){
    int i,d, num=-1, min=-1;
    double x,y;
    if(boss.flag==0){//ボスが居ない時
        for(i=0;i<ENEMY_MAX;i++){//敵の総数分
            if(enemy.flag==1){
                x=(enemy.x-cshot[k].x);
                y=(enemy.y-cshot[k].y);
                d=(int)(x*x+y*y);//ショットと敵の距離
                if(d<min || min==-1){//計算結果が最小値かまだ格納していないなら
                    num=i;//番号記録
                    min=d;//距離記録
                }
            }
        }
    }
    //近い敵が見つかったら、あるいはボスがいて、HPがあるときは角度をセット
    if(num!=-1 || boss.flag==1 && boss.hp>0 && boss.s_flag==0){
        if(boss.flag==0){
            x=enemy[num].x-cshot[k].x;
            y=enemy[num].y-cshot[k].y;
        }
        else{
            
            x=boss.x-cshot[k].x;
            y=boss.y-cshot[k].y;

        }
        cshot[k].angle=atan2(y,x);
    }
}


とすることで、解決してしまいました・・・(=.=;;)

閉鎖

“C言語何でも質問掲示板” へ戻る