ページ 11

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

Posted: 2011年1月16日(日) 22:07
by マグロ丼
先日あたり判定について質問したものです。
敵と弾が衝突した際にきちんときえてくれたのはいいのですが、
なぜかあたり判定の処理が衝突地点に残ってしまいました。
なにかいい解決法はないでしょうか。
ご教示願います。

コード:


	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);//フラグがたっていたら敵を描画
		}


画像

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

Posted: 2011年1月16日(日) 22:12
by h2so5
あたり判定の処理が衝突地点に残る、とは具体的にどのような動作になるのですか?

追記:
break; が気になります... continue; にしなくて良いのでしょうか?

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

Posted: 2011年1月16日(日) 22:16
by マグロ丼
残る、と断言するより残ってしまっているようです。に訂正します。
図を見ていただければわかると思いますが、
弾を撃ってもいないのに、最初に敵と弾が消滅した地点を次の敵が通過しようとすると消えてしまうということです。

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

Posted: 2011年1月16日(日) 22:19
by h2so5
単純に衝突したら弾の座標を画面外に出すか、
tama.flag==0; なら 判定しないようにすれば良いと思います。

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

Posted: 2011年1月16日(日) 22:42
by マグロ丼

コード:

	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
ちなみに実行結果は常に「接触していません」が表示し、弾がうてなくなってしまいました。

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

Posted: 2011年1月16日(日) 22:52
by h2so5

コード:

    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: 先日あたり判定について質問したものです。

Posted: 2011年1月16日(日) 23:06
by マグロ丼
h2so5様ありがとうございました。
おかげさまで思い通りの処理ができるようになりました!
感謝しております。本当にありがとうございました!

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

Posted: 2011年1月16日(日) 23:26
by ISLe
enが敵でtamaが弾だとすると同じインデックス同士を比較するだけではダメなのでは?
総当りでチェックしないと。

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

Posted: 2011年1月16日(日) 23:43
by softya(ソフト屋)
失礼ですが前回のことも含めて、根本的なことを理解せずに継ぎ接ぎされている印象を受けました。
弾の生存や敵の生存も含めて当たり判定って何をするべきなのかまとめ直されたらどうでしょうか?

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

もし、お気持ちがあるなら、この当たり判定の仕様を日本語で箇条書きしてみませんか?
アドバイス出来ると思いますよ。

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

Posted: 2011年1月17日(月) 00:24
by マグロ丼
>>ISle様
盲点でした。気づくきっかけをおあたえくださりありがとうございます。
(弾総当り・・・また大変なことになりそうだ・・・)

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

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

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

Posted: 2011年1月17日(月) 00:28
by softya(ソフト屋)
そのフローだと当たり判定時に弾と敵の生存性をチェックしていません。
有効な弾と生存している敵同士が当たり判定しないと
もちろん、ISleさんの言う総当りも行われていません。

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

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

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

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

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

Posted: 2011年1月17日(月) 11:54
by softya(ソフト屋)
flagが0の物は画面に存在(生存)していないと言うことですよね?
存在していない物同士を当たり判定しては、この最初の問いの問題と同じことになります。
当たり判定しても良いのはenもtamaもflagが1の場合だけです。

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

【追記】

>それでも課題に提出期限があるので必死なのです。
必死なのは分かりますが、結局のところ理解したほうが完成が早かったってことはありえませんか?