僕は公開しているゲーム中には矩形同士のあたり判定しか使ったことがないので
(公開してないやつで円同士のあたり判定を試したこともあります)、ここからはかなり実験的な内容に、
つまりさらにうさんくさくなってきますが、生暖かい目でどうぞ見てやってください。 まずは、簡単でポピュラーな「矩形同士」の当たり判定を見ていくことにしましょう。 いきなりですが、ソースを見てください。 function OverlapRect(Rect1,Rect2:TRect):Boolean; begin result:= (Rect1.Left < Rect2.Right )And (Rect1.Right > Rect2.Left )And (Rect1.Top < Rect2.Bottom)And (Rect1.Bottom > Rect2.Top ); end;ここまでシンプルにかけます。言葉でいうと 「ある矩形の左上座標がもういっこの矩形の右下座標よりも左上にあり、ある矩形の右下座標が もういっこの矩形の左上座標よりも右下にあるとき」二つの矩形は交わっています。 本当にこうなるのか不安な人は、試してみてください。 次は、3Dでポピュラーな「矩形同士」の判定を。なぜ3Dでよく使われるかというと、 回転しても状態が変わらないからです。自分で組むときが来れば、きっと矩形の限界を知り、円のすごさを 知るときがくるでしょう。それでは、またもやソースを。 function OverlapCircle(p1,p2:TPoint;r1,r2:Integer):Boolean; begin result:=sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y)) < (r1+r2); end;これもかなりシンプルにかけますね。言葉でいうと 「円1の中心と円2の中心の距離が、円1の半径+円2の半径より小さかったら、二つの円は重なっている」 といえます。 と、メジャーなのを二つ挙げてみました。「納得いかん!!」という人は図を書いたりして納得しちゃってください。 こっからが本番 ここまでは、ほんのウォーミングアップですね。上の二つは見たことのある人も多いでしょう。 じゃぁ、次は「線分同士のあたり判定」をみてみましょう。
|
※矩形 内角がすべて90度の長方形(もちろん正方形のときもある)。 windows.hにはRECT構造体が用意されている。 DELPHIの場合、windows.pasにTRect構造体。データには、左上、右下の二つの点を指定する
|