複数の矩形による判定

やってみます。


複雑な形状をしている敵とかだと、矩形では判定を表現しづらいケースが多々出てきます。例えば、こんな長細いキャラ。

長細いので、長方形で判定を表してみるのですが、思わずキャラを回転させてみたところ、酷い感じになってしまいました。当然ですね。


そこで、一つの矩形で判定をするのではなく、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度


こんな感じ。これを受けて、自機が自分の判定とぶつければ、敵との接触判定ができまっせ、ということ。

それじゃまた。