第3章 画像の表示・動作

3−7 当たり判定用矩形を小さくするには?(当たり判定・3)

7でキャラクタ同士の当たり判定を行うことができた。しかし、当たり判定に使用する矩形は画像の矩形の大きさをそのまま使っているため、絵的には衝突していないのに矩形で衝突してしまうという現象が起こってしまう。

そこで、当たり判定用の矩形を画像の矩形よりも小さくとり、当たり判定用の矩形同士で当たり判定を行うテクニックを紹介する。

(a) 当たり判定用の矩形を準備する

画像の矩形のうち、当たり判定に使う矩形を決め、変数に格納する。

[プログラム]

// グローバル変数
RECT MyCharRect; // マイキャラの矩形
RECT MyCharHitRect; // マイキャラの当たり判定用矩形
RECT TekiCharRect; // 敵キャラの矩形
RECT TekiCharHitRect; // 敵キャラの当たり判定用矩形

// 初期化用関数
void GameInit(void)
{
    //---------------------------------------------------初期化
    /* マイキャラ */
    SetRect(&MyCharRect, 100, 100, 142, 142); // 画像の矩形
    SetRect(&MyCharHitRect, 4, 2, 38, 40); // 当たり判定の矩形
    /* 敵キャラ */
    SetRect(&TekiCharRect, 100, 200, 142, 242); // 画像の矩形
    SetRect(&TekiCharHitRect, 2, 2, 40, 40); // 当たり判定の矩形
    ・
    ・
    ・

(b) 当たり判定用の矩形でキャラクタ同士の衝突を調べる

キャラクタの表示座標と当たり判定用矩形を元に、キャラクタ同士の当たり判定を行う。

[プログラム]

/* マイキャラと敵キャラの当たり判定を行う */
// マイキャラの表示位置を求める
SetRect(
    &Rect1,
    MyChar_x + MyCharHitRect.left,
    MyChar_y + MyCharHitRect.top,
    MyChar_x + MyCharHitRect.right,
    MyChar_y + MyCharHitRect.bottom);
// 敵キャラの表示位置を求める
SetRect(
    &Rect2,
    TekiChar_x + TekiCharHitRect.left,
    TekiChar_y + TekiCharHitRect.top,
    TekiChar_x + TekiCharHitRect.right,
    TekiChar_y + TekiCharHitRect.bottom);
// 衝突した場合の処理
if (HitCheck(Rect1, Rect2))
{
    ・
    ・
    ・

[ TOP ]