複数矩形の応用:レーザーとか

ゲームつくったら、レーザーの一本や2本出したいですよね。そういや、レーザーとビーム、物理的な特性はおいといて、みんなの観念の中での違いって何なんでしょうね。反射するのがレーザーで、反射しないのがビームとか、そんな感じか?


さて、パッと考えてみると、レーザー的な判定をしたい場合は、直線と矩形の判定でやるのが自然です。が、メリットデメリットが存在します。

  • 直線-矩形の判定をした場合
  • ○:見た目通りの判定なので、厳密に近い結果が得られる。
  • X:計算量が多くなってしまう。現状、(回転なし)矩形-矩形での判定を扱っているので、処理の異なる判定処理を追加しなければならない。

こんな感じ。じゃあ、ということで、計算量重視で矩形による当たり判定でやると

  • 矩形-矩形の判定をした場合
  • ○:計算量が少なくて済む。今まで作成してきた、矩形による判定処理を使いまわして表現できる。
  • X:当然、見た目と判定の不一致がでてくる。

という感じになります。まあ、ゲームだし、大体動けばいいんじゃない?つうことで、後者でやってみます。

void SetLazerHantei( POINT* BasePos, int Angle )
{
  // BasePos : レーザー判定の根元
  // Angle : レーザーの角度

  const int pitch = 8;

  POINT pos = {BasePos.x, BasePos.y};  // 判定の中心位置
  POINT sabun = {pitch * cos( Angle ), pitch * sin( Angle ) };  // 差分

  for( int idx=0; idx<(1024/8); idx++ )  // なんと、「画面の対角線の長さを超える判定を追加しておけば十分じゃね?」つういい加減なループ条件なのです!
  {
    AtariRect = 
    {
      pos.x - 8, // left
      pos.y - 8, // top
      pos.x + 8, // right
      pos.y + 8  // bottom
    };
    ListEnemy2Player.SetHantei(&Hantei);

    pos.x += sabun.x;  // 差分のぶんだけ、座標をずらす
    pos.y += sabun.y;  // 差分のぶんだけ、座標をずらす
  }
}

pitchが判定と判定の距離となっておりまして、まあ、こいつが小さいほど判定が細かくなり、大きいほど計算量が少なくて済むっつうトレードオフですね。自機がレーザーを無傷で跨いでしまうと流石に興ざめなので、判定と判定の隙間が自機の判定より大きくならない程度にpitchを調整してやると宜しいのではないでしょうか。

実は、ぷらづまれいヤでロックオンレーザーと敵との判定を直線-矩形でやってたりしたので、判定処理の比較をしてみるのも興味深いので気が向いたらそっちもやります。そして、きっと気が向きません。それではまた。