ファイブボックス 一分間スクラッチ講座 | #008 頭上の足場にぶつかったら跳ね返る処理 加速・重力ジャンプ応用編
前回は、加速ジャンプに「2段ジャンプ制御」を加えて、空中で何度もジャンプできてしまう問題を修正しました。
上向き矢印キーを押したときに、地面に触れているときだけジャンプできる という条件を入れることで、ゲームらしいジャンプに近づきました。

今回はその続きです。
ジャンプ中に、頭上に足場やブロックがあった場合、下からぶつかったらどうなるでしょうか。
本来であれば、プレイヤーはその足場をすり抜けたり、上に乗ってしまったりせず、頭をぶつけて下に跳ね返る
今回は、スクラッチでこの「頭上ブロックにぶつかったときの跳ね返り処理」を作っていきます。
これは Youtube ファイブボックス一分間スクラッチ講座 で今回の動きの開設動画です。
併せてご参照ください
今回作る動き
今回作るのは、次のような動きです。
プレイヤーがジャンプして上に移動しているとき、頭上の足場にぶつかったら、少し下に戻します。
反対に、プレイヤーが落下して地面に着地したときは、前回までと同じように、沈み込んだ分を上に戻します。
つまり、同じ「地面の色に触れた」という判定でも、
上に向かっているとき → 頭上の障害物にぶつかった
下に向かっているとき → 地面に着地した
というように、状況を分けて考える必要があります。
前回までのスクリプトの確認
前回の記事では、加速ジャンプに2段ジャンプ制御を加えました。
基本的な考え方は次の通りです。
上向き矢印キーが押された かつ 地面に触れている
この2つの条件を満たしたときだけ、ジャンプできるようにします。
これによって、空中で上向き矢印キーを何度押しても、2段ジャンプが起きないようになりました。
さらに、着地時にプレイヤーが地面へ沈み込んでしまう問題を防ぐために、沈み込み補正 も入れています。
このスクリプトの課題
前回までのスクリプトでも、通常のジャンプや着地はかなり自然に動きます。
しかし、頭上に足場がある場合に問題が起きます。
たとえば、プレイヤーがジャンプしている途中で、上にある足場にぶつかったとします。
このとき、スクリプトによっては、プレイヤーがその足場の上に移動してしまうことがあります。

今回はこれを修正していきます。
ポイントは「ジャンプ力」の向き
今回のポイントは、変数「ジャンプ力」です。
ジャンプ力がプラス、つまりジャンプ中は、プレイヤーは上に向かって移動しています。
反対に、ジャンプ力が0以下のとき、つまり落下中は。プレイヤーは下に向かって落ちている、または着地している状態です。
この違いを使って、処理を分けます。
大事なのは、同じ「地面の色に触れた」という状態でも、
上に向かっているのか、下に向かっているのかで処理を変える
ということです。

上に向かっているとき
まずは、プレイヤーが上に向かっている状態、つまりジャンプ力が0より大きい場合です。
この状態で頭上の足場やブロックにぶつかったとき、そのままだとプレイヤーがブロックの中にめり込んでしまうことがあります。
そこで、次のように処理します。
頭上ブロック(地面の色)に触れている間、y座標を-1ずつ変える
つまり、プレイヤーを少しずつ下に戻します。
これによって、頭上の足場から押し出されるような動きになります。
下に向かっているとき
次に、プレイヤーが落下している状態、つまりジャンプ力が0以下の場合です。
この状態で地面の色に触れた場合は、前回同様プレイヤーが着地したということですね。
地面の色に触れている間、y座標を1ずつ変える
つまり、プレイヤーを少しずつ上に戻します。
これによって、地面に沈み込んだ分を補正できます。
ブロックの考え方
今回追加する処理の考え方は、次のようになります。
もし地面の色に触れたなら、下のように振り分けます。
ジャンプ力が0より大きい場合
→ 上に向かっているので、頭上の障害物にぶつかった
→ y座標を-1ずつ変えて、下に戻す
そうでなければ
→ 落下中に地面へ着地した
→ y座標を1ずつ変えて、上に戻す

完成イメージ
今回の処理を入れると、次のような動きになります。
プレイヤーがジャンプする
↓
頭上の足場にぶつかる
↓
足場の中にめり込まないように下へ戻る
↓
ジャンプ力が止まり、落下に移る
↓
地面に着地したら沈み込み補正で上に戻る
これで、頭上に足場があるステージでも、自然なジャンプの動きに近づきます。

今回のまとめ
今回は、頭上の足場にぶつかったときの跳ね返り処理を作りました。
ポイントは、変数「ジャンプ力」を使って、プレイヤーが上に向かっているのか、下に向かっているのかを判断することです。
ジャンプ力が0より大きいときは、上に向かっている状態です。
このときに地面の色に触れたら、頭上の障害物にぶつかったと考えて、y座標を-1ずつ変えて下に戻します。
ジャンプ力が0より大きくないときは、落下中または着地中です。
このときに地面の色に触れたら、地面に沈み込んだと考えて、y座標を1ずつ変えて上に戻します。
また、この判定はジャンプ力を0にする前に入れる必要があります。
今回の処理を入れることで、頭上に足場があるステージでも、より自然なジャンプの動きになります。
最初は少し難しく見えるかもしれませんが、
上に進んでいるときは下に戻す
下に進んでいるときは上に戻す
と考えると分かりやすいです。
ジャンプゲームを作るときには、とても使いやすい処理なので、ぜひ試してみてください。
ファイブボックスでは、スクラッチやUnityの個別指導オンラインレッスンを行っています。
「スクラッチでゲームを作ってみたい」
「Unityにも挑戦してみたい」
「自分の作りたいゲームを一緒に完成させたい」
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!