ゲーム開発15:キャラクタ同士の当たり判定1

間髪入れずに当たり判定です。方法は色々ありますが、今回は矩形での当たり判定を行います。矩形とは四角形の事で、キャラクタを四角形として考えて、四角形同士が重なったかどうかで判定します。

判定はとりあえず存在するキャラクタ同士で総当たりさせます。キャラクタ管理クラスCCharaManageHit()という関数を作って、その中で行います。

まずは判定したいキャラクタからHit()が呼び出されます。内部では全キャラ分ループさせて、他のキャラと当たったかどうか判定します。キャラの矩形は、あらかじめキャラクタクラスCCharaに当たり判定用のRECT構造体を作っておき、そのRECTと座標mx,myから実際の座標系での矩形を生成します。重なるキャラが見つかったら、その番号と実座標の矩形を返します。

シンプルですね。ただこれだと複数のキャラとぶつかった場合、判定がおかしくなる可能性があります。あと高速で移動する小さなキャラの当たり判定も行えません。すり抜けちゃうから。

でも欲張ったら先に進めなくなるので、このまま行きます。

次回はこのHit()を使って、実際に当たり判定を行います。

//---------------------------------------------------------
// 当たり判定
int CCharaManage::Hit(int chara_no, float x, float y, RECT *retRect)
{
 int  i, ret;
 RECT myRect, yourRect;

 // 自分の矩形
 myRect=Chara[chara_no]->GetHitArea();
 myRect.top+=(LONG)y;
 myRect.bottom+=(LONG)y;
 myRect.left+=(LONG)x;
 myRect.right+=(LONG)x;

 ret=-1;
 for (i=0; i<MAX_CHARA; i++) {
  if (i!=chara_no && Chara[i]!=NULL) {
   // 相手の矩形
   yourRect=Chara[i]->GetHitArea();
   if (yourRect.top!=-1) {
    yourRect.top+=(LONG)Chara[i]->my;
    yourRect.bottom+=(LONG)Chara[i]->my;
    yourRect.left+=(LONG)Chara[i]->mx;
    yourRect.right+=(LONG)Chara[i]->mx;

    if (myRect.bottom>yourRect.top && myRect.top<yourRect.bottom 
     && myRect.left<yourRect.right && myRect.right>yourRect.left) {
      // 当たった
      ret=i;
      *retRect=yourRect;
    }
   }
  }
 }
 return ret;
}

コメントを残す

メールアドレスが公開されることはありません。