このセクションでは前のセクションで説明した衝突判定を行うためにブロックの中心座標を計算します。
上ブロックの中心座標の計算
上ブロックの中心座標(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
座標はby
にbs / 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
文を使用して全てのブロックの中心座標を求めます。
// プレイヤーの更新
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// プレイヤーの更新
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次のセクションではプレイヤーとブロックの距離を求めます。