当たり判定について

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

当たり判定について

#1

投稿記事 by マナ » 16年前

初めまして、シューティングゲームの館を参考にしているマナと申します。
質問なんですが、自分の撃った弾と敵とが接触した時の当たり判定は上手くいったのですが
逆に自分と敵の弾が接触した時の判定がどうしても出来ません。
「19、プレイヤーと敵との当り判定」に書いてあったものを自分なりに考えて

void out(){
for(int i=0;i<ENEMY_TOTAL_SHOT_NUM;i++){//ショットの全列分
if(EnemyShot.flag==1){//その弾が発射中なら
for(int s=0;s<ENEMY_TOTAL_NUM;s++){//全敵100体分
if(enemy.flag==1){//その敵のショットが出現中なら
double x,y;
int range;
x=(int)(Player.x-EnemyShots.x);
y=(int)(Player.y-EnemyShots.x);
range=5;
if( (int)sqrt(x*x+y*y) < range+Player.range){
Player.flag=0;
EnemyShot.flag=0;
if(CheckSoundMem(sound_player_death)==1)
StopSoundMem(sound_player_death);
PlaySoundMem(sound_player_death,DX_PLAYTYPE_BACK);
}
}
}
}
}
}

とし、
自機の当たり判定をいろいろと変えてみたのですが上手くいきません。
何故か左上に当り判定が固定されてしまったり
自機とまったく関係ない位置で敵弾が反応したりしてしまいます。
最終的には東方シリーズのように赤い点を表示して、そこを当り判定にしたいのですが…
どなたか詳しい方教えて下さい、お願いします。

MNS

Re:当たり判定について

#2

投稿記事 by MNS » 16年前

y=(int)(Player.y-EnemyShots.x);
これは
y=(int)(Player.y-EnemyShots.y);
こうではないでしょうか?

マナ

Re:当たり判定について

#3

投稿記事 by マナ » 16年前

>MNS様

すみません、そこはおっしゃる通りのウッカリミスでした。
ですがそこを直しても判定は前と変わらず固定されているようです;
当ったかどうかの処理ではなく、自機の当たり判定設定がおかしいのでしょうか…
三平方の定理を使えばいい、ということは分かるのですが…。

それとひとつめの投稿、タグを使うのを忘れてしまったので
もう一度書き直しておきますm(_ _)m
void out(){
        for(int i=0;i<ENEMY_TOTAL_SHOT_NUM;i++){//ショットの全列分
        	if(EnemyShot.flag==1){//その弾が発射中なら
                	for(int s=0;s<ENEMY_TOTAL_NUM;s++){//全敵100体分
                        	if(enemy.flag==1){//その敵のショットが出現中なら
                                	double x,y;
                                        int range;
                                        x=(int)(Player.x-EnemyShots.x);
                                        y=(int)(Player.y-EnemyShots.y);
                                	range=5;
                                        if( (int)sqrt(x*x+y*y) < range+Player.range){
                                                        Player.flag=0;
							EnemyShot.flag=0;
                                                        if(CheckSoundMem(sound_player_death)==1)
                                                                StopSoundMem(sound_player_death);
                            		PlaySoundMem(sound_player_death,DX_PLAYTYPE_BACK);
                                                }
                                        }
                                }
                        }
                }
        }

TRUTH

Re:当たり判定について

#4

投稿記事 by TRUTH » 16年前

>>何故か左上に当り判定が固定されてしまったり

このことから座標設定がおかしいのだとおもいます。
Player.xやEnemyShots.x 共にしっかり値がはいってるか確認してみると分かると思います。

マナ

Re:当たり判定について

#5

投稿記事 by マナ » 16年前

>TRUTH様

仰る通りだと思います。
おそらく当たり判定が「プレイヤーの画像のx、y」ではなく
「画面全体のx、y」で計算されてしまい、
左上に設定されてしまっているのだと思います。

そこまでは分かっているんです。
解説で
enemy.range=(MONSTER1_X_SIZE-60)/2.0f*enemy.size;

と書かれている敵の当たり判定部分を
どう書き換えれば自機の当たり判定になるのかが分からないんです。
おそらくここの書き換えが間違っているのだろうとは思っているのですが…
分かる方、引き続きお願いします。

pooka

Re:当たり判定について

#6

投稿記事 by pooka » 16年前

ちょっと気になったんですが、シューティングゲームの館を参考にしているということなので、
もしかすると敵のショットの実装方法を変えているかもしれないので違うかもしれませんが、
館のとおりだとすると
void&#160;out()
{
&#160;&#160;&#160;&#160;for(int&#160;i=0;i&#160;<&#160;ENEMY_TOTAL_NUM;i++)&#160;&#160;&#160;&#160;//全敵分ループ
&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(EnemyShot.flag&#160;==&#160;1)&#160;&#160;&#160;&#160;//ショットしている組があれば
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for(int&#160;j=0;j&#160;<&#160;ENEMY_TOTAL_SHOT_NUM;j++)&#160;&#160;&#160;&#160;//個々の弾について
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(EnemyShot.EnemyShots[j].flag&#160;==&#160;1)//実際にショットしている弾なら
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{&#160;&#160;&#160;&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;double&#160;x,y;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int&#160;range;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;x&#160;=&#160;(int)(Player.x-EnemyShot.EnemyShots[j].x);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;y&#160;=&#160;(int)(Player.y-EnemyShot.EnemyShots[j].y);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;range&#160;=&#160;5;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if((int)sqrt(x*x+y*y)&#160;<&#160;range+Player.range)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Player.flag&#160;=&#160;0;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EnemyShot.EnemyShots[j].flag&#160;=&#160;0;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if(CheckSoundMem(sound_player_death)&#160;==&#160;1)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;StopSoundMem(sound_player_death);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PlaySoundMem(sound_player_death,DX_PLAYTYPE_BACK);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
&#160;&#160;&#160;&#160;}
}
こんな感じで判定できるかと思います。

>enemy.range=(MONSTER1_X_SIZE-60)/2.0f*enemy.size;
>と書かれている敵の当たり判定部分を
>どう書き換えれば自機の当たり判定になるのかが分からないんです。
敵の場合は画像の表示サイズを変えることができるため上のような式になっていますが、
自機の場合はPlayer.range&#160;=&#160;2のように自分の設定したい値を設定すればいいかと思います。

マナ

Re:当たり判定について

#7

投稿記事 by マナ » 16年前

> pooka様

なるほど、表示サイズのための計算だったんですか…。
てっきり、rangeで当たり判定を設定しているのかと思っていました。
どうやら私の勘違いが原因だったようで;

ばっちり弾に当たるようになりました!
自分の書いたものと見比べて、しっかり勉強させていただこうと思います。

答えて下さった皆様、本当にありがとうございました!
また何かあったらよろしくお願いしますm(_ _)m

pooka

Re:当たり判定について

#8

投稿記事 by pooka » 16年前

>なるほど、表示サイズのための計算だったんですか…。
>てっきり、rangeで当たり判定を設定しているのかと思っていました。
いえrangeで当たり判定を設定していますよ。
敵はenemy.sizeによって画像の表示サイズを変更できるので、
それに伴い当たり判定のサイズも変えています。
(例えば小さく表示した敵に合わせて設定した当たり判定のままでは、大きな敵の場合敵に当たっているのに死なないなんてことに)
自機は表示サイズを変更できるようにはなっていないので、固定の値でいいかなと。

説明不足で混乱させてしまったようで、すみません。

閉鎖

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