当り判定について

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

当り判定について

#1

投稿記事 by 華穂 » 16年前

華穂です。
あぅ・・まさかの3日連続の書き込みです。
ごめんなさい。

えと、今日はちょっと・・題名通り当り判定についてアドバイスがほしくて書き込み
させていただきました。

昨日のアドバイスのおかげでようやく敵の動きをつくることができ、ほっとして
いたんですが、今日から自機の弾と敵との当り判定を作ったところ・・なぜか弾が
素通りするという事態に・・「???(泣)」状態です。
えと、DrawFormatを利用したところ、どうやら弾が出た(発射)時から既にはずれになっている
んです。



ソースは・・。
当り判定だけちょっと敵の挙動の関数からはずして別の関数を利用してみました。

int My_Atari()
{
int Cr = GetColor(255, 255, 255);

//弾が表示されていれば判定
if(TamaFlag == 1)
{
if((( TamaX > EZakoX && TamaX < EZakoX + EZakoW) &&
( EZakoX > TamaX && EZakoX < TamaX + TamaW)) ||
(( TamaY > EZakoY && TamaY < EZakoY + EZakoH) &&
( EZakoY > TamaY && EZakoY < TamaY + TamaH)))
{
//当たったら敵と弾消滅
BotuEZako = 0;
TamaFlag = 0;

DrawFormatString(0, 400, Cr, "当たり%d", BotuEZako);
}
else
{
DrawFormatString(0, 400, Cr, "はずれ%d", BotuEZako);
}
}
return 0;
}



です。
えと、この敵(TEZako)はsin波の動きの敵です。
弾は1発発射したら画面外に出るまでは次の弾が発射できないようにしているため、
(TamaFlag)としました。
当れば敵と弾は消滅します。
が、なぜかこれではただ敵を華麗にスル―するという・・当り判定は円?丸?ではなく、
□・矩形の判定です。

これはあれでしょうか・・、弾で考えているから駄目なんでしょうか?



なにとぞアドバイス・ご指摘・ご指南の方をよろしくお願いします。

TRUTH

Re:当り判定について

#2

投稿記事 by TRUTH » 16年前

こんばんはー

if((( TamaX > EZakoX && TamaX < EZakoX + EZakoW) [color=red>&&[/color]
( EZakoX > TamaX && EZakoX < TamaX + TamaW)) [color=red>||[/color]
(( TamaY > EZakoY && TamaY < EZakoY + EZakoH) [color=red>&&[/color]
( EZakoY > TamaY && EZakoY < TamaY + TamaH)))
とありますが、赤い部分の&&と||は逆では上手くいきませんか?

( TamaX > EZakoX && TamaX < EZakoX + EZakoW) &&( EZakoX > TamaX && EZakoX < TamaX + TamaW))
まったく逆の条件で&&を使っているので常に偽になっているのだと思います。

華穂

Re:当り判定について

#3

投稿記事 by 華穂 » 16年前

TRUTH様、ありがとうございます!

さっそく試してみたところ、なんと当りました!!
先ほど判定の||と&&の意味について調べてみたところ・・
私の思っていた意味とまったく逆でした。(情けない・・)
逆の意味でとらえていたのにひやっとしてしまいました。


ですが、まだ当るだけで消滅・・消えはしないのでそれをどうにかしないと
いけませんね。
一応、ステージ1の雑魚敵として考えているので、HPは1・・つまり1回当れば
消滅しているように BotuEZako = 0 としているのですが・・。

今のこの当り判定では、1回当りで消えはしないんしょうか?
やはりきちんとどこかでHPを作らないとダメでしょうか?(てか駄目ですよね)

華穂

Re:当り判定について

#4

投稿記事 by 華穂 » 16年前

何度もすみませんっ(汗)


えと、今まで↑の質問をしてしまってから自分で
あれこれ考えて試してみた結果・・。

まぁ、敵をまだ1体でしか試していないということもあって、
(BotuEZako)から(EZako)へと変更してみたところ、
消えてくれました。



なので・・これで大丈夫かなぁ・・とは思うんですが・・。
どうでしょうか?
えと、1ステージの波敵は5体なのでこれから5体出すようにしたいと
おもんですが・・ここでもまたなんか凡ミスやらかしそうなので、
ぜひともなにかアドバイスをもらえたら嬉しいかと・・。


どうぞよろしくおねがいします。

夢夢

Re:当り判定について

#5

投稿記事 by 夢夢 » 16年前

当たった時にHPが減る処理を当たり判定の関数内に一緒に入れればいいのでは?
消える処理はHPが0だったら消える処理という具合に。

EZakoX,EZakoY・・・と変数を追加していると、
敵を増やす時に大変なので、
構造体を使いましょう。
struct ENEMY{
  x;
  y;
  hp;
}
ENEMY EZako[5];//5体分
参照する時は EZako[0].xまたはEZako->xという風に使います。

華穂

Re:当り判定について

#6

投稿記事 by 華穂 » 16年前

遅くなってしまって申し訳ありませんっ!
夢夢様。

そうなんですよね。
1体だけならまだしも、1ステージは8体~5ステージでは50体ほど出さなければならないため、
構造体かクラスを利用しろと講師から言われたため、只今最初からこれまで作っていたプログラムを
利用し、クラスで作っております。

しかし、構造体も考えていたため、このアドバイスはとてもうれしいです!!

クラスの場合だと、また違う形なので、これもまたどうしようかと軽く悩んでいます。


でも、ありがたいですね。
ご指摘・アドバイス・・・どうもありがとうございました!
とりあえず、今はまだ自機のクラスを終えてようやく雑魚敵のクラスを書き始めたため、
当り判定まではたどり着いておりませんが・・また別の書き込みをするかもしれません。

その時は、どうぞよろしくお願いします!

閉鎖

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