ページ 1 / 1
当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 20:50
by マグロ丼
お久しぶりです。また質問させていただきに参りました。
弾と敵とに当たり判定をつけようと思い、ゲームプログラミングの館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;
}

Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 20:55
by kimuchi
DrawGraph関数のFALSEは透明情報を無効化するフラグです。
描画自体を無効にする=DrawGraph関数を呼ばないということです。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 21:12
by マグロ丼
なるほど。そうだったんですか。理解しました。
しかし、それならばとフラグによって描画を管理しようとしましたがうまくいきません。
なにが悪いんでしょうか、なにとぞご教示願います。
コード:
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);//フラグがたったら敵を描画
}
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 21:25
by kimuchi
今ざっとコードを拝見したのですが、
x*x+y*y<en.range*tama.rangeはどの変数も定数として扱われており、
常に偽となっています。ですので消えるはずがありません。
あとこの判定式はおそらく間違いです。正しくは
x*x+y*y<(en.range+tama.range)*(en.range+tama.range)
だと思います。
追記:上の段落は完璧に私の勘違いでしたので無視して下さい。orz
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 21:48
by マグロ丼
常に偽ですか。
むう、具体的にどうすればできるんでしょうか。
判定式まで間違ってましたかorz
やはりただのコピペではいけない、ということですね。。。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:02
by kimuchi
すみません、常に偽の方は多分私の勘違いですのでお気になさらずにお願いします。
判定式を変えても結果は変わらないですか?
あと、tama.xの情報が欲しいのですが、掲示して下さいますか?
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:05
by h2so5
上記のコードですと、フラグは何の意味もなく、
「弾と敵の距離がrange内である間、敵を描画しない」という処理になっています。
そもそも
en.flag=1;//フラグをたてる
if (en.flag==1)DrawGraph( en.x , en.y ,image_enemy,TRUE);//フラグがたったら敵を描画
の部分でflagは常に1ですから、if (en.flag==1)を入れる意味はありません。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:10
by マグロ丼
>>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様
なるほど。これは失態です。
しかしその描画しない、という処理が的確に行われないのです。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:18
by h2so5
マグロ丼 さんが書きました:しかしその描画しない、という処理が的確に行われないのです。
的確に行われないとは、具体的にどのような状態ですか?
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:21
by マグロ丼
「弾と敵の距離がrange内である間、敵を描画しない」
はずなのにrange内にあるにもかかわらず、敵が消えない。ということです。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:23
by kimuchi
>>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: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:33
by マグロ丼

>>kimuchi様
ダメですね、結局図のようになってしまいます。
弾と敵の距離がrange内である間、敵を描画する。という処理はできるのに
(
if(x*x+y*y<(en
.range+tama.range)*(en.range+tama.range))
↑を>にするだけで望んだ結果が得られたのですが。
弾と敵の距離がrange内である間、敵を描画しない処理はうまくいきません。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:38
by kimuchi
すみません、48行目のen.flag=1;も削除してみて下さい。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:43
by マグロ丼
>>kimuchi様
ダメですね。それを消すと今度は表示自体されなくなってしまいましたorz
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:46
by kimuchi
敵を登録するところで
en.flag=1;
を入れてみて下さい。
掲載コードにはありませんがそういう処理はありますよね。
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:55
by マグロ丼
>>kimuchi様
おおおおお!!
できました! ありがとうございました!!
Re: 当たり判定で敵を消すには?
Posted: 2011年1月06日(木) 22:57
by kimuchi
蛇足です。
あんまりこういうことを言えるような立場ではないのですが、
処理の流れをもっと追ってみるように心がけてみると何処で間違えているのかが、
分かりやすくなると思います。
また、自分の間違いを棚に上げるようですが、先ほどの「常に偽」と私が誤って申してしまったものも、
当たり判定の式も、言われたことを鵜呑みにしないで、一度ご自分で考えた方が良いです。