初めまして、シューティングゲームの館を参考にしているマナと申します。
質問なんですが、自分の撃った弾と敵とが接触した時の当たり判定は上手くいったのですが
逆に自分と敵の弾が接触した時の判定がどうしても出来ません。
「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);
}
}
}
}
}
}
とし、
自機の当たり判定をいろいろと変えてみたのですが上手くいきません。
何故か左上に当り判定が固定されてしまったり
自機とまったく関係ない位置で敵弾が反応したりしてしまいます。
最終的には東方シリーズのように赤い点を表示して、そこを当り判定にしたいのですが…
どなたか詳しい方教えて下さい、お願いします。
当たり判定について
Re:当たり判定について
y=(int)(Player.y-EnemyShots.x);
これは
y=(int)(Player.y-EnemyShots.y);
こうではないでしょうか?
これは
y=(int)(Player.y-EnemyShots.y);
こうではないでしょうか?
Re:当たり判定について
>MNS様
すみません、そこはおっしゃる通りのウッカリミスでした。
ですがそこを直しても判定は前と変わらず固定されているようです;
当ったかどうかの処理ではなく、自機の当たり判定設定がおかしいのでしょうか…
三平方の定理を使えばいい、ということは分かるのですが…。
それとひとつめの投稿、タグを使うのを忘れてしまったので
もう一度書き直しておきますm(_ _)m
すみません、そこはおっしゃる通りのウッカリミスでした。
ですがそこを直しても判定は前と変わらず固定されているようです;
当ったかどうかの処理ではなく、自機の当たり判定設定がおかしいのでしょうか…
三平方の定理を使えばいい、ということは分かるのですが…。
それとひとつめの投稿、タグを使うのを忘れてしまったので
もう一度書き直しておきます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);
}
}
}
}
}
}
Re:当たり判定について
>>何故か左上に当り判定が固定されてしまったり
このことから座標設定がおかしいのだとおもいます。
Player.xやEnemyShots.x 共にしっかり値がはいってるか確認してみると分かると思います。
このことから座標設定がおかしいのだとおもいます。
Player.xやEnemyShots.x 共にしっかり値がはいってるか確認してみると分かると思います。
Re:当たり判定について
>TRUTH様
仰る通りだと思います。
おそらく当たり判定が「プレイヤーの画像のx、y」ではなく
「画面全体のx、y」で計算されてしまい、
左上に設定されてしまっているのだと思います。
そこまでは分かっているんです。
解説で
と書かれている敵の当たり判定部分を
どう書き換えれば自機の当たり判定になるのかが分からないんです。
おそらくここの書き換えが間違っているのだろうとは思っているのですが…
分かる方、引き続きお願いします。
仰る通りだと思います。
おそらく当たり判定が「プレイヤーの画像のx、y」ではなく
「画面全体のx、y」で計算されてしまい、
左上に設定されてしまっているのだと思います。
そこまでは分かっているんです。
解説で
enemy.range=(MONSTER1_X_SIZE-60)/2.0f*enemy.size;
と書かれている敵の当たり判定部分を
どう書き換えれば自機の当たり判定になるのかが分からないんです。
おそらくここの書き換えが間違っているのだろうとは思っているのですが…
分かる方、引き続きお願いします。
Re:当たり判定について
ちょっと気になったんですが、シューティングゲームの館を参考にしているということなので、
もしかすると敵のショットの実装方法を変えているかもしれないので違うかもしれませんが、
館のとおりだとすると
void out()
{
    for(int i=0;i < ENEMY_TOTAL_NUM;i++)    //全敵分ループ
    {
        if(EnemyShot.flag == 1)    //ショットしている組があれば
        {
            for(int j=0;j < ENEMY_TOTAL_SHOT_NUM;j++)    //個々の弾について
            {
                if(EnemyShot.EnemyShots[j].flag == 1)//実際にショットしている弾なら
                {    
                    double x,y;
                    int range;
                    x = (int)(Player.x-EnemyShot.EnemyShots[j].x);
                    y = (int)(Player.y-EnemyShot.EnemyShots[j].y);
                    range = 5;
                    if((int)sqrt(x*x+y*y) < range+Player.range)
                    {
                        Player.flag = 0;
                        EnemyShot.EnemyShots[j].flag = 0;
                        if(CheckSoundMem(sound_player_death) == 1)
                        {
                            StopSoundMem(sound_player_death);
                        }
                        PlaySoundMem(sound_player_death,DX_PLAYTYPE_BACK);
                    }
                }
            }
        }
    }
}
こんな感じで判定できるかと思います。
>enemy.range=(MONSTER1_X_SIZE-60)/2.0f*enemy.size;
>と書かれている敵の当たり判定部分を
>どう書き換えれば自機の当たり判定になるのかが分からないんです。
敵の場合は画像の表示サイズを変えることができるため上のような式になっていますが、
自機の場合はPlayer.range = 2のように自分の設定したい値を設定すればいいかと思います。
もしかすると敵のショットの実装方法を変えているかもしれないので違うかもしれませんが、
館のとおりだとすると
void out()
{
    for(int i=0;i < ENEMY_TOTAL_NUM;i++)    //全敵分ループ
    {
        if(EnemyShot.flag == 1)    //ショットしている組があれば
        {
            for(int j=0;j < ENEMY_TOTAL_SHOT_NUM;j++)    //個々の弾について
            {
                if(EnemyShot.EnemyShots[j].flag == 1)//実際にショットしている弾なら
                {    
                    double x,y;
                    int range;
                    x = (int)(Player.x-EnemyShot.EnemyShots[j].x);
                    y = (int)(Player.y-EnemyShot.EnemyShots[j].y);
                    range = 5;
                    if((int)sqrt(x*x+y*y) < range+Player.range)
                    {
                        Player.flag = 0;
                        EnemyShot.EnemyShots[j].flag = 0;
                        if(CheckSoundMem(sound_player_death) == 1)
                        {
                            StopSoundMem(sound_player_death);
                        }
                        PlaySoundMem(sound_player_death,DX_PLAYTYPE_BACK);
                    }
                }
            }
        }
    }
}
こんな感じで判定できるかと思います。
>enemy.range=(MONSTER1_X_SIZE-60)/2.0f*enemy.size;
>と書かれている敵の当たり判定部分を
>どう書き換えれば自機の当たり判定になるのかが分からないんです。
敵の場合は画像の表示サイズを変えることができるため上のような式になっていますが、
自機の場合はPlayer.range = 2のように自分の設定したい値を設定すればいいかと思います。
Re:当たり判定について
> pooka様
なるほど、表示サイズのための計算だったんですか…。
てっきり、rangeで当たり判定を設定しているのかと思っていました。
どうやら私の勘違いが原因だったようで;
ばっちり弾に当たるようになりました!
自分の書いたものと見比べて、しっかり勉強させていただこうと思います。
答えて下さった皆様、本当にありがとうございました!
また何かあったらよろしくお願いしますm(_ _)m
なるほど、表示サイズのための計算だったんですか…。
てっきり、rangeで当たり判定を設定しているのかと思っていました。
どうやら私の勘違いが原因だったようで;
ばっちり弾に当たるようになりました!
自分の書いたものと見比べて、しっかり勉強させていただこうと思います。
答えて下さった皆様、本当にありがとうございました!
また何かあったらよろしくお願いしますm(_ _)m
Re:当たり判定について
>なるほど、表示サイズのための計算だったんですか…。
>てっきり、rangeで当たり判定を設定しているのかと思っていました。
いえrangeで当たり判定を設定していますよ。
敵はenemy.sizeによって画像の表示サイズを変更できるので、
それに伴い当たり判定のサイズも変えています。
(例えば小さく表示した敵に合わせて設定した当たり判定のままでは、大きな敵の場合敵に当たっているのに死なないなんてことに)
自機は表示サイズを変更できるようにはなっていないので、固定の値でいいかなと。
説明不足で混乱させてしまったようで、すみません。
>てっきり、rangeで当たり判定を設定しているのかと思っていました。
いえrangeで当たり判定を設定していますよ。
敵はenemy.sizeによって画像の表示サイズを変更できるので、
それに伴い当たり判定のサイズも変えています。
(例えば小さく表示した敵に合わせて設定した当たり判定のままでは、大きな敵の場合敵に当たっているのに死なないなんてことに)
自機は表示サイズを変更できるようにはなっていないので、固定の値でいいかなと。
説明不足で混乱させてしまったようで、すみません。