このセクションでは前のセクションで説明した衝突判定を行うためにブロックの中心座標を計算します。

上ブロックの中心座標の計算

上ブロックの中心座標(ubx, uby)(upper block x, upper block y)を計算します。下の画像を参照してください。

前提としてわかっているのはブロック対の中心座標です。この説明ではこの座標を(bx, by)とします。

まずは、ブロックの中心のx座標ubxを求めます。上の画像からもわかる通り、ブロックの中心のx座標はブロック対の中心座標と同じですのでbxになります。

続いて、ブロックの中心のy座標ubyを求めます。ブロックの中心のy座標は、上の辺のy座標と下の辺のy座標の平均値になります。

上の図より上の辺のy座標は0、下の辺のy座標はbyからbs/2を引いたby - bs / 2です。よってブロックの中心のy座標は(by - bs / 2) / 2になります。

以上より、上ブロックの中心座標(ubx, uby)(bx, (by - bs / 2) / 2)になります。

下ブロックの中心座標の計算

同様に下ブロックの中心座標(lbx, lby)(lower block x, lower block y)を計算します。下の画像を参照してください。

上ブロックと同様に前提としてわかっているのはブロック対の中心座標です。この説明ではこの座標を(bx, by)とします。

まずは、ブロックの中心のx座標lbxを求めます。上の画像からもわかる通り、ブロックの中心のx座標はブロック対の中心座標と同じですので、bxになります。

続いて、ブロックの中心のy座標lbyを求めます。ブロックの中心のy座標は、上の辺のy座標と下の辺のy座標の平均値になります。

上の図より上の辺のy座標はbybs / 2を足したby + bs / 2、下の辺のy座標はcvs.heightです。よってブロックの中心のy座標は((by + bs / 2) + cvs.height) / 2になります。

以上より、下ブロックの中心座標(lbx, lby)(bx, ((by + bs / 2) + cvs.height) / 2)になります。

update_player関数の更新

以下のようにupdate_player関数に衝突判定の処理を加えます。for文を使用して全てのブロックの中心座標を求めます。

main.js
// プレイヤーの更新
function update_player() {
  // ジャンプ時の処理
  if (jump_flag) {
    jump_flag = false;
    pvy = jump_pvy;
  }

  // 基準速度未満であれば追加速度を与える
  if (pvy < standard_pvy) {
    pvy += add_pvy;
  }

  // 基準速度を超えていれば基準速度にする
  if (pvy > standard_pvy) {
    pvy = standard_pvy;
  }

  // 速度をもとに座標を変更
  py += pvy;

  // ブロックとの衝突判定
  for (let i = 0; i < bx_list.length; i++) {
    // 上ブロックの中心座標
    const ubx = bx_list[i];
    const uby = (by_list[i] - bs / 2) / 2;

    // 下ブロックの中心座標
    const lbx = bx_list[i];
    const lby = ((by_list[i] + bs / 2) + cvs.height) / 2;
  }
}
JavaScript
main.js
// プレイヤーの更新
function update_player() {
  // ジャンプ時の処理
  if (jump_flag) {
    jump_flag = false;
    pvy = jump_pvy;
  }

  // 基準速度未満であれば追加速度を与える
  if (pvy < standard_pvy) {
    pvy += add_pvy;
  }

  // 基準速度を超えていれば基準速度にする
  if (pvy > standard_pvy) {
    pvy = standard_pvy;
  }

  // 速度をもとに座標を変更
  py += pvy;

  // ブロックとの衝突判定
  for (let i = 0; i < bx_list.length; i++) {
    // 上ブロックの中心座標
    const ubx = bx_list[i];
    const uby = (by_list[i] - bs / 2) / 2;

    // 下ブロックの中心座標
    const lbx = bx_list[i];
    const lby = ((by_list[i] + bs / 2) + cvs.height) / 2;
  }
}
JavaScript

次のセクションではプレイヤーとブロックの距離を求めます。

次へ