当たり判定で敵を消すには?

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

当たり判定で敵を消すには?

#1

投稿記事 by マグロ丼 » 14年前

お久しぶりです。また質問させていただきに参りました。

弾と敵とに当たり判定をつけようと思い、ゲームプログラミングの館11章ででてきた三角関数で当たり判定をつけてみました。
当たり判定は作動しているようなのですが、敵がきちんときえてくれず、図のようになってしまいます。
DrawGraph関数をfalseにするだけでは消えないのでしょうか。
なにとぞ、お教えください。(一応、当たり判定のコードを張っておきます。

コード:

		 en[i].range=100;
        tama[i].range=100;
		int x,y;
		en[i].x=240;//敵の位置はテストとして固定
		en[i].y=240;
		 x=en[i].x-tama[i].x;
         y=en[i].y-tama[i].y;

		    if(x*x+y*y>en[i].range*tama[i].range){//三角関数で当たり判定をきめる 
        DrawGraph( en[i].x , en[i].y ,image_enemy,TRUE);//敵を描画
		en[i].flag=1;}
			else 
				DrawGraph( en[i].x , en[i].y ,image_enemy,false);//敵を消去
		en[i].flag=0;
		}
			
画像

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#2

投稿記事 by kimuchi » 14年前

DrawGraph関数のFALSEは透明情報を無効化するフラグです。
描画自体を無効にする=DrawGraph関数を呼ばないということです。

マグロ丼

Re: 当たり判定で敵を消すには?

#3

投稿記事 by マグロ丼 » 14年前

なるほど。そうだったんですか。理解しました。
しかし、それならばとフラグによって描画を管理しようとしましたがうまくいきません。
なにが悪いんでしょうか、なにとぞご教示願います。

コード:

		    if(x*x+y*y<en[i].range*tama[i].range)
		en[i].flag=0;//フラグを消す
	else    
		en[i].flag=1;//フラグをたてる
			if (en[i].flag==1)DrawGraph( en[i].x , en[i].y ,image_enemy,TRUE);//フラグがたったら敵を描画		
}

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#4

投稿記事 by kimuchi » 14年前

今ざっとコードを拝見したのですが、
x*x+y*y<en.range*tama.rangeはどの変数も定数として扱われており、
常に偽となっています。ですので消えるはずがありません。

あとこの判定式はおそらく間違いです。正しくは
x*x+y*y<(en.range+tama.range)*(en.range+tama.range)
だと思います。

追記:上の段落は完璧に私の勘違いでしたので無視して下さい。orz

マグロ丼

Re: 当たり判定で敵を消すには?

#5

投稿記事 by マグロ丼 » 14年前

常に偽ですか。
むう、具体的にどうすればできるんでしょうか。
判定式まで間違ってましたかorz
やはりただのコピペではいけない、ということですね。。。

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#6

投稿記事 by kimuchi » 14年前

すみません、常に偽の方は多分私の勘違いですのでお気になさらずにお願いします。
判定式を変えても結果は変わらないですか?
あと、tama.xの情報が欲しいのですが、掲示して下さいますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 当たり判定で敵を消すには?

#7

投稿記事 by h2so5 » 14年前

上記のコードですと、フラグは何の意味もなく、
「弾と敵の距離がrange内である間、敵を描画しない」という処理になっています。

そもそも
en.flag=1;//フラグをたてる
if (en.flag==1)DrawGraph( en.x , en.y ,image_enemy,TRUE);//フラグがたったら敵を描画

の部分でflagは常に1ですから、if (en.flag==1)を入れる意味はありません。

マグロ丼

Re: 当たり判定で敵を消すには?

#8

投稿記事 by マグロ丼 » 14年前

>>kimuchi様
了解です。

コード:

void main1(){
  
    int i;

    if((GetNowCount() - StartTime) > 60000){    //1ステージの制限時間は60秒
        function_status=2;
    }
	player();

    if(counter<5)                        //前にエンターを押してから5カウント未満なら              
        counter++;                       //カウントアップ 
    else if( Key[ KEY_INPUT_SPACE]  == 1 ){//5カウント以上たっていたら
        counter=0;//カウンターを戻す

        for(i=0;i<5;i++){
            if(tama[i].flag==0){     //発射していない玉を探し、        
                tama[i].x=ch.x+100;
                tama[i].y=ch.y;
                tama[i].flag=1;  //発射フラグを立てる
                break;
            }
        }                           
    }
    
camerax=ch.x;
 if(camerax<0) camerax=0;
 if(camerax>1280) camerax=1280; 

DrawGraph( -camerax , -cameray ,image_stage, TRUE);//ステージを描画
DrawGraph( ch.x-camerax , ch.y-cameray , ch.img , TRUE ) ;//画像を描画
    
        for(i=0;i<5;i++){
        if(tama[i].flag==1){ //発射している玉なら
            tama[i].x+=5; //xをキャラ位置分増やす 
            DrawGraph( tama[i].x-camerax , tama[i].y-cameray , image_tama , TRUE );//玉を描画
            if(tama[i].x < -32+camerax || tama[i].x > 672+camerax){ //もし画面外まで来たら
                tama[i].flag=0; //発射フラグを戻す
            }
		}
		//あたり判定
		 en[i].range=100;
        tama[i].range=100;
		int x,y;
		 x=en[i].x-tama[i].x;
         y=en[i].y-tama[i].y;
		   en[i].x=240;
	en[i].y=240;           
	en[i].flag=1;
		    if(x*x+y*y<(en[i].range+tama[i].range)*(en[i].range+tama[i].range))
		en[i].flag=0;//フラグを消す
	else    
		en[i].flag=1;//フラグをたてる
   DrawGraph( en[i].x , en[i].y ,image_enemy,TRUE);//フラグがたったら敵を描画
				
}
	if(ch.x>STAGE1_END_X-150)
		function_status=2;
    if(Key[KEY_INPUT_X]==1)           
        function_status=2;
}
こんな感じですが、どうすればうまくいくのでしょうか。

>>h2so5様

なるほど。これは失態です。
しかしその描画しない、という処理が的確に行われないのです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 当たり判定で敵を消すには?

#9

投稿記事 by h2so5 » 14年前

マグロ丼 さんが書きました:しかしその描画しない、という処理が的確に行われないのです。
的確に行われないとは、具体的にどのような状態ですか?

マグロ丼

Re: 当たり判定で敵を消すには?

#10

投稿記事 by マグロ丼 » 14年前

「弾と敵の距離がrange内である間、敵を描画しない」
はずなのにrange内にあるにもかかわらず、敵が消えない。ということです。

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#11

投稿記事 by kimuchi » 14年前

>>49~53行目にかけて

コード:

if(x*x+y*y<(en[i].range+tama[i].range)*(en[i].range+tama[i].range))
        en[i].flag=0;//フラグを消す
if(en[i].flag)
        DrawGraph( en[i].x , en[i].y ,image_enemy,TRUE);//フラグがたっていたら敵を描画


このように書きなおしてみて下さい。
コードの意味するところは、
上のifは弾が敵の当たり判定内に来たら敵のフラグを0にして、
下のifは敵のフラグが0以外なら描画をするものです。

せっかく掲示していただきましたが、tama.xのところは関係なさそうです。

マグロ丼

Re: 当たり判定で敵を消すには?

#12

投稿記事 by マグロ丼 » 14年前

画像
>>kimuchi様

ダメですね、結局図のようになってしまいます。
弾と敵の距離がrange内である間、敵を描画する。という処理はできるのに

if(x*x+y*y<(en.range+tama.range)*(en.range+tama.range))
      ↑を>にするだけで望んだ結果が得られたのですが。

弾と敵の距離がrange内である間、敵を描画しない処理はうまくいきません。

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#13

投稿記事 by kimuchi » 14年前

すみません、48行目のen.flag=1;も削除してみて下さい。

マグロ丼

Re: 当たり判定で敵を消すには?

#14

投稿記事 by マグロ丼 » 14年前

>>kimuchi様

ダメですね。それを消すと今度は表示自体されなくなってしまいましたorz

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#15

投稿記事 by kimuchi » 14年前

敵を登録するところで
en.flag=1;
を入れてみて下さい。
掲載コードにはありませんがそういう処理はありますよね。

マグロ丼

Re: 当たり判定で敵を消すには?

#16

投稿記事 by マグロ丼 » 14年前

>>kimuchi様
おおおおお!!
できました! ありがとうございました!!

アバター
kimuchi
記事: 163
登録日時: 14年前
住所: 東京

Re: 当たり判定で敵を消すには?

#17

投稿記事 by kimuchi » 14年前

蛇足です。
あんまりこういうことを言えるような立場ではないのですが、
処理の流れをもっと追ってみるように心がけてみると何処で間違えているのかが、
分かりやすくなると思います。
また、自分の間違いを棚に上げるようですが、先ほどの「常に偽」と私が誤って申してしまったものも、
当たり判定の式も、言われたことを鵜呑みにしないで、一度ご自分で考えた方が良いです。

閉鎖

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