【初心者向け】当たり判定の実装方法(敵×プレイヤー)|HTML+JavaScriptで簡単解説

当たり判定の実装方法 ゲーム制作入門

ゲーム制作で必ず必要になるのが**「当たり判定」**です。
この記事では、HTML+JavaScriptの2Dゲームを想定して、
敵とプレイヤーがぶつかった瞬間を検出する方法を、
初心者の方にも分かるように解説します。


当たり判定とは?

当たり判定とは、
キャラクター同士が画面上で重なったかどうかを判定する仕組みのことです。

当たり判定ができるようになると、以下のような処理が可能になります。

  • 敵に触れたらダメージを受ける
  • ゲームオーバー判定
  • ノックバックやエフェクト演出

👉 2Dゲームでは 「四角形(矩形)同士の判定」 が最も一般的です。


今回使う当たり判定の考え方

プレイヤーと敵を 四角形 として扱い、
次の4つの条件をチェックします。

当たっていない状態

  • プレイヤーの右端が敵の左端より左
  • プレイヤーの左端が敵の右端より右
  • プレイヤーの下端が敵の上端より上
  • プレイヤーの上端が敵の下端より下

このどれか1つでも当てはまれば「非接触」
👉 逆に言うと、全部外れたら衝突です。


プレイヤー・敵のデータ例

まずは、プレイヤーと敵の情報を用意します。

const player = {
  x: 100,
  y: 200,
  width: 32,
  height: 32,
  hp: 3,
  isInvincible: false
};

const enemy = {
  x: 120,
  y: 210,
  width: 32,
  height: 32
};

当たり判定の関数(コピペOK)

以下の関数が、当たり判定の心臓部です。

function isCollision(a, b) {
  return !(
    a.x + a.width < b.x ||
    a.x > b.x + b.width ||
    a.y + a.height < b.y ||
    a.y > b.y + b.height
  );
}

💡 true が返ってきたら「衝突している」という意味です。


ゲームループでの使い方

ゲームの更新処理(requestAnimationFrameなど)の中で使います。

if (isCollision(player, enemy)) {
  console.log("敵と衝突!");
}

ダメージ処理を追加する

無敵時間なし(シンプル版)

if (isCollision(player, enemy)) {
  player.hp--;
}

⚠ このままだと、毎フレームHPが減るので注意。


無敵時間あり(おすすめ)

if (!player.isInvincible && isCollision(player, enemy)) {
  player.hp--;
  player.isInvincible = true;

  setTimeout(() => {
    player.isInvincible = false;
  }, 1000); // 1秒間無敵
}

✨ 実際のゲームに近い挙動になります。


当たり判定を調整するコツ

操作感を良くするために、
見た目より当たり判定を少し小さくするのがおすすめです。

const hitBox = {
  x: player.x + 4,
  y: player.y + 4,
  width: player.width - 8,
  height: player.height - 8
};

よくある失敗例

❌ 画像サイズと当たり判定サイズが合っていない
❌ 無敵時間がなく一瞬でゲームオーバー
❌ 当たり判定が大きすぎて理不尽に感じる

👉 デバッグ用に枠線を表示すると調整しやすくなります。

次に読みたいおすすめ記事

▶ 次のステップ①

【初心者向け】攻撃判定の実装方法(プレイヤー → 敵)

▶ 次のステップ②

【JavaScriptゲーム】HP管理&ゲームオーバー処理


まとめ

  • 当たり判定は 矩形判定が基本
  • 関数化すると再利用しやすい
  • 無敵時間を入れるとゲームらしくなる
  • 当たり判定は「少し小さめ」が正解
タイトルとURLをコピーしました