先日あたり判定について質問したものです。

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

先日あたり判定について質問したものです。

#1

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

先日あたり判定について質問したものです。
敵と弾が衝突した際にきちんときえてくれたのはいいのですが、
なぜかあたり判定の処理が衝突地点に残ってしまいました。
なにかいい解決法はないでしょうか。
ご教示願います。

コード:


	for(i=0;i<10;i++){
		en[i].range=10;
        tama[i].range=10;
        double x,y;
      
         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)*(en[i].range+tama[i].range)){//三角関数で当たり判定をきめる 
		DrawString(  0,0,"○接触しています!!○",GetColor(255,255,0));
        en[i].flag=0;
		tama[i].flag=0;
		break;
			}
			if(en[i].flag==1) 
				DrawGraph( en[i].x-camerax , en[i].y ,image_enemy,TRUE);//フラグがたっていたら敵を描画
		}


画像

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

Re: 先日あたり判定について質問したものです。

#2

投稿記事 by h2so5 » 15年前

あたり判定の処理が衝突地点に残る、とは具体的にどのような動作になるのですか?

追記:
break; が気になります... continue; にしなくて良いのでしょうか?
最後に編集したユーザー h2so5 on 2011年1月16日(日) 22:16 [ 編集 1 回目 ]

マグロ丼

Re: 先日あたり判定について質問したものです。

#3

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

残る、と断言するより残ってしまっているようです。に訂正します。
図を見ていただければわかると思いますが、
弾を撃ってもいないのに、最初に敵と弾が消滅した地点を次の敵が通過しようとすると消えてしまうということです。

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

Re: 先日あたり判定について質問したものです。

#4

投稿記事 by h2so5 » 15年前

単純に衝突したら弾の座標を画面外に出すか、
tama.flag==0; なら 判定しないようにすれば良いと思います。

マグロ丼

Re: 先日あたり判定について質問したものです。

#5

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

コード:

	for(i=0;i<10;i++){
		en[i].range=10;
        tama[i].range=10;
        double x,y;
      
         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)*(en[i].range+tama[i].range)){//三角関数で当たり判定をきめる 
				DrawString(  0,0,"○接触しています!!○",GetColor(255,255,0));
        en[i].flag=0;
		tama[i].flag=0;
		continue;}
			else if(tama[i].flag==0){
		DrawString(  0,0,"○接触していません!!○",GetColor(255,255,0));
        en[i].flag=1;
		tama[i].flag=1;	
			}
			if(en[i].flag==1) 
				DrawGraph( en[i].x-camerax , en[i].y ,image_enemy,TRUE);//フラグがたっていたら敵を描画
	}
こういうことでしょうか・・・orz
ちなみに実行結果は常に「接触していません」が表示し、弾がうてなくなってしまいました。

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

Re: 先日あたり判定について質問したものです。

#6

投稿記事 by h2so5 » 15年前

コード:

    for(i=0;i<10;i++){
    
        en[i].range=10;
        tama[i].range=10;
        double x,y;
      
        x=en[i].x-tama[i].x;
        y=en[i].y-tama[i].y;
        
        if(tama[i].flag == 1 && (x*x+y*y<(en[i].range+tama[i].range)*(en[i].range+tama[i].range))){//三角関数で当たり判定をきめる
        
	        DrawString(  0,0,"○接触しています!!○",GetColor(255,255,0));
	        en[i].flag=0;
	        tama[i].flag=0;
	        continue;
	        
        }

        if(en[i].flag==1) 
            DrawGraph( en[i].x-camerax , en[i].y ,image_enemy,TRUE);//フラグがたっていたら敵を描画
    }
こうだと思いますけど。

あと、もう少し見やすいような改行やインデントの入れ方をしたほうが良いと思います。

マグロ丼

Re: 先日あたり判定について質問したものです。

#7

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

h2so5様ありがとうございました。
おかげさまで思い通りの処理ができるようになりました!
感謝しております。本当にありがとうございました!

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 先日あたり判定について質問したものです。

#8

投稿記事 by ISLe » 15年前

enが敵でtamaが弾だとすると同じインデックス同士を比較するだけではダメなのでは?
総当りでチェックしないと。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 先日あたり判定について質問したものです。

#9

投稿記事 by softya(ソフト屋) » 15年前

失礼ですが前回のことも含めて、根本的なことを理解せずに継ぎ接ぎされている印象を受けました。
弾の生存や敵の生存も含めて当たり判定って何をするべきなのかまとめ直されたらどうでしょうか?

[前回の質問]
http://dixq.net/forum/viewtopic.php?f=3&t=7484

もし、お気持ちがあるなら、この当たり判定の仕様を日本語で箇条書きしてみませんか?
アドバイス出来ると思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マグロ丼

Re: 先日あたり判定について質問したものです。

#10

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

>>ISle様
盲点でした。気づくきっかけをおあたえくださりありがとうございます。
(弾総当り・・・また大変なことになりそうだ・・・)

>>softya様
仰るとおりです。恥ずかしながら根本的なことは理解していません。
それでも課題に提出期限があるので必死なのです。
無礼を承知で、ご理解いただきたく存じます。

画像
と、↑のような感じにしたいのです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 先日あたり判定について質問したものです。

#11

投稿記事 by softya(ソフト屋) » 15年前

そのフローだと当たり判定時に弾と敵の生存性をチェックしていません。
有効な弾と生存している敵同士が当たり判定しないと
もちろん、ISleさんの言う総当りも行われていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

マグロ丼

Re: 先日あたり判定について質問したものです。

#12

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

>>softya様
いまいちピンとこないのですorz
総当り、というとプレイ画面に表示している弾一つ一つに、
おなじような処理を組み込むということになるのです。
ガサっと一気に処理できるような組み方が思いつきません。
生存性、というとHPですね。
現在、敵も味方もグラが一つしかないので1発で倒れるように作ってます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: 先日あたり判定について質問したものです。

#13

投稿記事 by ISLe » 15年前

マグロ丼 さんが書きました:総当り、というとプレイ画面に表示している弾一つ一つに、
おなじような処理を組み込むということになるのです。
enとtamaの要素数が10あるので、enの要素1個に対してtamaの要素10個ずつ100の組み合わせを処理するということです。
forループを入れ子にするということです。
マグロ丼 さんが書きました:生存性、というとHPですね。
現在、敵も味方もグラが一つしかないので1発で倒れるように作ってます。
enとtamaの要素数が10あるので、画面に表示している敵や弾が10個未満なら使っていない要素があるわけです。
使っている配列要素が生きている要素で、使っていない配列要素が死んでいる要素です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 先日あたり判定について質問したものです。

#14

投稿記事 by softya(ソフト屋) » 15年前

flagが0の物は画面に存在(生存)していないと言うことですよね?
存在していない物同士を当たり判定しては、この最初の問いの問題と同じことになります。
当たり判定しても良いのはenもtamaもflagが1の場合だけです。

ところで期限って何時で、後どのぐらい作るものが残っているのでしょうか?

【追記】

>それでも課題に提出期限があるので必死なのです。
必死なのは分かりますが、結局のところ理解したほうが完成が早かったってことはありえませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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