複数の矩形による判定
やってみます。
複雑な形状をしている敵とかだと、矩形では判定を表現しづらいケースが多々出てきます。例えば、こんな長細いキャラ。
長細いので、長方形で判定を表してみるのですが、思わずキャラを回転させてみたところ、酷い感じになってしまいました。当然ですね。
そこで、一つの矩形で判定をするのではなく、2つの矩形に分割してやってみます。
まだ、完璧とはいえませんが、先ほどの場合に比べれば遥かにいい感じです。矩形を3つ、4つと増やしていけばさらに厳密に近づきますが、判定は元々目に見えないもの、例のように2つくらいで十分な結果が得られることが殆どです。これを、多少実装寄りに表現してみます。例によってC++風に書くと
void SetNagaiTekinoHantei( int x, int y, int Angle ) { // in: // x,y : キャラの座標 // Angle : キャラの回転角度 const int length = 20; for( int idx=0; idx<2; idx++ ) { // 判定の中心を求める POINT center; int tmpAngle = Angle + 2048*idx; center.x = x + length * cos( tmpAngle ); center.y = y + length * sin( tmpAngle ); // 判定を登録する AtariRect Hantei = { center.x - 16, // left center.y - 16, // top center.x + 16, // right center.y + 16 // bottom }; ListEnemywPlayer.SetAtari( &Hantei ) ); } } // 因みに、角度は右が0度
こんな感じ。これを受けて、自機が自分の判定とぶつければ、敵との接触判定ができまっせ、ということ。
それじゃまた。