レーザーの連続照射について

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

レーザーの連続照射について

#1

投稿記事 by yrao » 15年前

あけましておめでとうございます。
 
またもボス弾幕関連の質問なのですが・・・ 
 
今回はレーザーを次々に撃たせる方法について知りたくて質問させてもらいまいた。
 
 
図のように、

前に撃ったレーザーがまだ残っている間に次のレーザーを撃つ, 

ということをしたいのです。例えば、
 
//レーザー発射関数です
int lazer_way( double x , double y , int way , double wayangle , double angle , int length , int haba , int hantei  , int col , int flag , int state){
int i,k;
 for(i=0;i<way;i++){
        if((k=search_boss_shot())!=-1){
            if((k=search_lazer())!=-1){

                lazer[k].startpt.x = x;
                lazer[k].startpt.y = y;
                lazer[k].length    = length;
                lazer[k].haba      = haba;
                lazer[k].hantei    = hantei;
                lazer[k].col       = col;
                lazer[k].flag      = flag;
                lazer[k].angle       = angle-wayangle*(way/2)+wayangle*i;
                lazer[k].state     = state;
                lazer[k].knd       = 0;
                lazer[k].cnt       = 0;
            }
}
}
return k;
}    

void boss_shot_bulletH025(){
    int i,k,t=boss_shot.cnt%120;

    if(t==0)lazer_way(0+100  ,100,8,PI2/8 ,PI/2+rang(PI2/16),400,1,0,0,1,0);
    if(t==40)lazer_way(FMX-100,100,8,PI2/8,PI/2+rang(PI2/16),400,1,0,1,1,1);

    for(i=0;i<LAZER_MAX;i++){
        if(lazer.state==0){
            if(t==20){
                lazer.haba=20;
                lazer.hantei=0.8;
            }
            if(t>30 && t<=70)lazer.haba-=0.5;
            if(t==70)lazer.flag=0;
        }
    }
    for(k=0;k<LAZER_MAX;k++){
        if(lazer[k].state==1){
            if(t==60){
                lazer[k].haba=20;
                lazer[k].hantei=0.8;
            }
            if(t>70 && t<=110)lazer[k].haba-=0.5;
            if(t==110)lazer[k].flag=0;
        }
    }



}


のような感じです。



しかし、
この弾幕は問題なく動作するのですが、次のような弾幕を作ったときに、
明らかに自機はレーザーに触れていないのにもかかわらず、自機が被弾する、
という現象が起きてしまい困っています・・
被弾しないときもあるのですが、大抵の場合被弾します(レーザーの方向がまちまちになる時はほとんどといってもいい程です)

それと、わざわざ引数を複数使ってレーザーを撃つのも効率が悪い気がします・・・
ほかに良い方法はないでしょうか?

昨日から考えているのですが、自分ではどうにも解決できなさそうです・・・
アドバイスよろしくお願いしますm()m

void boss_shot_bulletH026(){
     int k,l,t=boss_shot.cnt%800;
    
    if(t==130 || t==200 || t==270 || t==340 || t==410)input_phy_pos(ch.x,FMY/2+rang(FMY/4),60);
    if(t==500)input_phy_pos(FMX/2,100,80);

    if(t==190)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,0);
    if(t==260)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,0,1,1);
    if(t==330)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,2);
    if(t==400)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,0,1,3);
    if(t==470)lazer_way(boss.x,boss.y,1,PI2/10,bossatan2(),600,1,0,1,1,4);

    
    for(k=0;k<LAZER_MAX;k++){
        if(lazer[k].state==0){
            if(t==700){
                lazer[k].haba=20;
                lazer[k].hantei=0.8;
            }
            if(t>700 && t<=710)lazer[k].haba-=2;
            if(t==711)lazer[k].flag=0;
        }
    }
    for(l=0;l<LAZER_MAX;l++){
        if(lazer[[/url].state==1){
            if(t==707){
                lazer[[/url].haba=20;
                lazer[[/url].hantei=0.8;
            }
            if(t>707 && t<=717)lazer[[/url].haba-=2;
            if(t==718)lazer[[/url].flag=0;
        }
    }
    for(k=0;k<LAZER_MAX;k++){
        if(lazer[k].state==2){
            if(t==714){
                lazer[k].haba=20;
                lazer[k].hantei=0.8;
            }
            if(t>714 && t<=724)lazer[k].haba-=2;
            if(t==725)lazer[k].flag=0;
        }
    }
    for(l=0;l<LAZER_MAX;l++){
        if(lazer[[/url].state==3){
            if(t==721){
                lazer[[/url].haba=20;
                lazer[[/url].hantei=0.8;
            }
            if(t>721 && t<=731)lazer[[/url].haba-=2;
            if(t==732)lazer[[/url].flag=0;
        }
    }
    for(k=0;k<LAZER_MAX;k++){
        if(lazer[k].state==4){
            if(t==728){
                lazer[k].haba=20;
                lazer[k].hantei=0.8;
            }
            if(t>728 && t<=738)lazer[k].haba-=2;
            if(t==739)lazer[k].flag=0;
        }
    }    


}
画像

あ~る

Re:レーザーの連続照射について

#2

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

やってみたら普通に動きましたよ…?
当たり判定を表示してみたりしたらどうなりますか?

というか面白いレーザーの使い方ですね、多分パクります(笑)

yrao

Re:レーザーの連続照射について

#3

投稿記事 by yrao » 15年前

あ~るさん、再びどうもです。

設置→起爆 のイメージのレーザーを作りたくて、その簡易版として試作してみたのがこの弾幕です。
こんなのでよければ、どうぞパクってください(笑)



被弾しませんか・・・
おかしいですね(-_-;
確かに、被弾しないときもあるのですが・・・



画像は、このバグ(?)で被弾したときの様子です。
レーザーにも弾にも当たってはいないと思います・・・
 
あと、被弾のタイミングですが、その時によって違うようです。
最後のレーザーの時もあれば、2本めと3本目の間の時もあります。

あ~る

Re:レーザーの連続照射について

#4

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

おはようございます

とりあえずレーザー当たり判定計算が3つありますよね?
それを一つずつコメントアウトしたりして判定しないようにして、どこが誤判定になってるか調べてみて下さい

あ~る

Re:レーザーの連続照射について

#5

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

多分僕が考えてる理由と同じなら、
get_sita関数内の

theta=atan2(s,t)

の前に

if(s!=0 && t!=0)

っていう条件を入れれば直ると思います
違ったらすいません、すいませんというかわかりません、申し訳ないです

Justy

Re:レーザーの連続照射について

#6

投稿記事 by Justy » 15年前


> 条件を入れれば直ると思います

 あんまりよくわかっていないんですが、それだと戻り値 thetaが不定になるような。

 ひょっとしたら out_lazer関数の判定で、レーザーの幅が 0以下だったら判定しないようにすれば
改善されるかもしれません。

あ~る

Re:レーザーの連続照射について

#7

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

>>Justyさん

前に同じ様なバグが僕にも起こって、それで質問したらこうするように言われたんで、もしかしたら同じかなぁ?と思いました

細かい経緯は忘れてしまったので過去ログみないとわからないです……
でも確かに両方0の時はどうなってんでしょうね、これ…(-.-;)

Justy

Re:レーザーの連続照射について

#8

投稿記事 by Justy » 15年前


> もしかしたら同じかなぁ

 直接的な原因としては多分そのあたりだと思います。
 
 atan2の引数両方が 0の場合は定義域エラーですので、対処としては部分的にあっているのるのですが、
処理できなかったことを get_sita関数の戻り先に通知しない&戻り値 thetaが未初期化のままなのが
問題になります。



> 両方0の時はどうなってんでしょうね

 両方が0になるということは、レーザーの幅が0のときでこの場合角度を求めるのに必要な3点のうち2点が
同じ位置にあるなので角度が出せない状態の時だと思われます。

 なので、幅が0ならレーザーは存在しないものとしてあたり判定から外してしまえばいいかと
考えたのですが、私はあまり龍神録には明るくないのでこれでいいのかどうかはレーザーシステムの
設計者に訊かないと判りません。

yrao

Re:レーザーの連続照射について

#9

投稿記事 by yrao » 15年前

あ~るさん、Justyさん、どうもありがとうございますm(__)m

なんか…質問者なのに話し合いに参加できなくてすみません(+_+)


エラーの方ですが、
最終的に、out_lazer()で1を返す直前に、(lazer.haba<0)の条件を入れたところ、解消されたようです。

ありがとうございました<(__)>



…エラーの原因はなんだったのでしょうかね……

既に消したはずのレーザーが、再び、撃たれたことになっていた
…ということでしょうか?

あ~る

Re:レーザーの連続照射について

#10

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

今過去ログみてみたら全く関係なかったです、すいません…
で、間違ったこと教えて申し訳無かったんで過去ログ調べまくった結果
hitjudge_square_and_circle関数内の長方形の中に物体が入り込んでいるかどうかを判定の部分の

if(0<=theta && theta<=PI/2 && 0<=theta2 && theta2<=PI/2)



if(0<theta && theta<=PI/2 && 0<theta2 && theta2<=PI/2)

にすれば直るようです
結構みんななってるようです
というか僕もなったんですけど当たり判定自体をしないようにしただけでした(-.-;)

変な事いって申し訳ないです…

あ~る

Re:レーザーの連続照射について

#11

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

あう、すれ違っとる…
まぁ直ったんなら良かったです(^-^)

yrao

Re:レーザーの連続照射について

#12

投稿記事 by yrao » 15年前

過去ログまで調べていただいて…
なんだか逆に申し訳ないです('_';



さっき、

lazer.haba<0
の分岐で解決した

と言ったのですが、解決してませんでした…

これでは、逆にレーザーに自機当たらなくなってしまいますね…
エラーで被弾しなくなったのをいいことに、普通に表示されるレーザーでは被弾するのかを確認し忘れていました(-.-;
やるとしたら、
lazer.haba>0ですね…



あ~るさんのおっしゃった通り、長方形の当たり判定の部分を変更したところ、無事、エラーは無くなりました。
どうもありがとうございましたm(__)m 画像

閉鎖

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