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