間髪入れずに当たり判定です。方法は色々ありますが、今回は矩形での当たり判定を行います。矩形とは四角形の事で、キャラクタを四角形として考えて、四角形同士が重なったかどうかで判定します。
判定はとりあえず存在するキャラクタ同士で総当たりさせます。キャラクタ管理クラスCCharaManageにHit()という関数を作って、その中で行います。
まずは判定したいキャラクタから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;
}