当たり判定

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

当たり判定

#1

投稿記事 by srepy-T » 15年前

このサイトで紹介されている環境でゲームを作ろうと思っているものです。
剣を振りまわすような感じで正確な当たり判定をつけたいんですけど、

      |
\ _ | _ /
   \ _|_ /
\ | /
     \|/   こんな感じです

1ドットごとに手打ちにしてすべてに当たり判定をつけようと思っているんですが、いい方法はないでしょうか?
回答よろしくお願いします。

sleepy-T

Re:当たり判定

#2

投稿記事 by sleepy-T » 15年前

名前と図間違いました・・・
図は上のような感じです。

ookami

Re:当たり判定

#3

投稿記事 by ookami » 15年前

ちょw 図wwww
もし「剣」がある程度小さければ、わざわざドット単位にしないで四角形など簡単な当たり判定にしても、それなりに見えると思いますが、大きいと正確にやりたくなってきますよね。

atanで敵と自分の角度を求めて、剣の角度と比較するなどはどうでしょう。

Dixq (管理人)

Re:当たり判定

#4

投稿記事 by Dixq (管理人) » 15年前

必ずドット単位で判定をする必要がありますか?
ものすごく複雑な形なのでしょうか?

速い動作なら若干いい加減な辺り判定でも案外わからないものですよ。
長方形や円、三角形の組み合わせじゃだめなんですかね?
意外とどうにでもなるものですよ。
例えば
○△□が右に飛んでるとしましょう。

三三三三三三三 ○

三三三三三三三 △

三三三三三三三 □

軌跡に対してはこの3つは全て同じ辺り判定で問題ないですよね。

もう少し詳しい剣の図があれば良いかもしれません。

ドット単位で全て計算することは出来ますが、そうすると計算量がとんでもないことになります・・。

sleepy-T

Re:当たり判定

#5

投稿記事 by sleepy-T » 15年前

>atanで敵と自分の角度を求めて、剣の角度と比較するなどはどうでしょう。
この方法で正確にやるのは難しそうなんですけど大丈夫でしょうか?

>必ずドット単位で判定をする必要がありますか?
こだわりがあるわけではないのですが、できるだけ正確にやりたいと考えています。

>ものすごく複雑な形なのでしょうか?
2Dで直線だけで先端がとがっている一般的なものです。

ドット単位といっても安定して動作する大きさにしようと思っています。
あと剣のリーチなどもかえるつもりなので汎用性のあるものにしたいです。

いまの自分の実力ではドット単位が一番あっていると思うのですが、やはり実践的ではないのでしょうか?

Dixq (管理人)

Re:当たり判定

#6

投稿記事 by Dixq (管理人) » 15年前

どれ位の大きさか解りませんが、当たる対象物もドット単位なのでしょうか?
100x100だとすると(全ドット計算する必要はないと思いますが)
最高1万回の計算が必要です(1万回計算する必要がある時は四角形なのであてはまりませんが)。

100x100の画像と100x100の画像のあたり判定を計算すると計算量は1億になってしまいますね。
たった一つと一つを計算するだけでとんでもない計算量になりそうです。

こうなると全ての計算をドット単位でやるなら、あたり判定を書いた白黒画像を用意して、実際に描画して描画先の色を調べた方が早いかもしれません。

しかし、円形に振り回すんですよね。
そうなるとマイフレームごとに綿密にドット単位で計算してもほとんどすり抜けてしまうと思いますよ。
例えば今●が右方向に4[マス/フレーム]で飛んでいるとしましょう。
 
 □□□三●□□□三●□□□三●□□□三●□□□三●□□□三●

こんな感じですね。フレームごとにきちんと計算してもその間を計算しないとすり抜けます。
□の部分に障害物があってもあたったことになりませんよね。
円形に振り回す場合は円の外側は、先がとがってるなら特に問題になるでしょう。

その場合剣の軌跡を計算しないといけないので、むしろドット単位の方が難しいんじゃないでしょうか。
単純に四角形と三角形の組み合わせで計算した方が良いように思います。

sleepy-T

Re:当たり判定

#7

投稿記事 by sleepy-T » 15年前

あたる物体は丸、四角などの基本的なかたちにしようと思っています。

なるほどすり抜けてしまうこともあるんですね・・・

基本的なことなんですが、三角形の当たり判定っていうのはどのように計算するのでしょうか?

sleepy-T

Re:当たり判定

#8

投稿記事 by sleepy-T » 15年前

簡単な骨組みができましたので、添付します。
こんな感じのスピード、形にしたいと思っています。
「Z」で剣を振ります
http://firestorage.jp/download/3da94b5d ... 4471aaf080t=

ookami

Re:当たり判定

#9

投稿記事 by ookami » 15年前

> 簡単な骨組みができましたので
すごいですね...!

予想通りの動きだったので、atan の話をもう少し説明させていただきます。

double meX,meY; // 自分の座標
double enX,enY; // 敵の座標


meX=...
meY=...
enX=...
enY=...

double dx,dy; // 自分から見た敵の相対座標
dx=enX-meX;
dy=enY-meY;

double ang = atan2(dy,dx); // 自分から見た敵の角度。Angle。
double dist= sqrt(dy*dy+dx*dx); // 敵までの距離。
double PI=acos(-1.0); // 3.14...

if(ang>PI && ang<PI*2.0 && dist<20.0) {
// 当たった処理
}

// NOTE 剣の動きが数フレームなので、扇形全体に当たり判定があるものとしています。


sleepy-Tさんのおっしゃる ドット単位 とは違う方向ですが、違和感が出ないことを期待します。
Dixq (管理人)さんのおっしゃるとおり、ドット単位ではすり抜けたりしますし、
剣もこれくらいの大きさなら、四角形など基本的な図形でやるのがいいかもしれません。

sleepy-T

Re:当たり判定

#10

投稿記事 by sleepy-T » 15年前

実際に作ってみてこの場合だったらookamiさんがおっしゃっているように扇状に計算したほうが堅実ですね・・・・。
今回はookamiさんが提案された方式でいきたいと思います。
たくさんの回答本当にありがとうございました。

閉鎖

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