ファイブボックス 一分間スクラッチ講座 | #007 空中ジャンプ、2段ジャンプを防ぐ方法
前回の記事では、スクラッチで
加速するジャンプと、地面に沈み込まないための補正を作りました。

ただし、空中でもう一度ジャンプできてしまう という問題が残っています。
いわゆる、2段ジャンプの状態です。
ゲームによっては2段ジャンプも楽しい仕組みですが、今回は 地面にいるときだけジャンプできるという、基本的なジャンプを作っていきます。
Youtube ファイブボックス 一分間スクラッチ講座でも動画を作っていますので、併せてご参照ください!
今回やること
今回の目的は、次のようなジャンプにすることです。
地面にいるときだけジャンプできる
つまり、
上向き矢印キーが押された
地面に触れている
この2つの条件がそろったときだけ、ジャンプできるようにします。
前回作ったジャンプの確認
前回までのスクリプトでは、次のような流れでジャンプを作っていました。
まず、旗が押されたときに
位置を初期化する
ジャンプ力を0にする
重力を-1にする
という準備をします。
そして、ずっと処理の中で、
上向き矢印キーが押されたら、ジャンプ力を15にする
ジャンプ力の分だけy座標を変える
重力によってジャンプ力を少しずつ減らす
地面に沈み込まないように補正する
という処理を行っていました。

この仕組みによって、キャラクターは上に飛び、だんだん勢いが弱くなり、最後は下に落ちてきます。
なぜ2段ジャンプができてしまうのか
作成済みのスクリプトはジャンプの条件がかなり単純で、上向き矢印キーが押されたらジャンプする、という条件だけでした。
そのため、キャラクターが地面にいるか、空中にいるかに関係なく、上向き矢印キーを押せばジャンプできてしまいます。
つまり、空中で上向き矢印キーを押すと、もう一度ジャンプ力が入ってしまうわけです。
これが2段ジャンプの原因です。
ジャンプの条件に「地面に触れている」を追加する
2段ジャンプを防ぐには、ジャンプできる条件を増やします。
上向き矢印キーが押された
かつ
地面の色に触れている に変更します。

スクラッチでは、条件を2つ同時に確認したいときに、緑色の「かつ」ブロックを使います。
これで、空中にいるときは地面に触れていないため、上向き矢印キーを押してもジャンプできなくなります。
「かつ」や「または」は下の図で確認してくださいね!

でも、このままだとジャンプできないことがある
ここで1つ注意点があります。
前回の記事で、地面に沈み込まないようにするために、ブロック定義を使って補正処理を作りました。
その補正処理では、キャラクターが地面に触れたときに、地面から少し上に戻すような処理をしています。
考え方としては、次のような処理です。
地面に触れている間、
y座標を1ずつ上げるこれによって、キャラクターが地面に沈み込むのを防いでいます。
ただし、この処理はとても高速に行われます。
そのため、見た目では地面に立っているように見えても、内部的にはほんの少しだけ地面から浮いている状態になることがあります。
すると「地面の色に触れている」という条件が成立しません。
その結果、上向き矢印キーを押しても、ジャンプできないことがあります。
解決方法:ジャンプ判定の直前だけ少し下に動かす
この問題を解決するために、ジャンプの判定をする直前に、キャラクターのy座標を少しだけ下げます。
具体的には「y座標を -1 ずつ変える」を追加します。

これによって、キャラクターを一瞬だけ下に動かし、地面の色に触れているかを確認しやすくします。
つまり、ジャンプできるか確認するために一瞬だけ地面に接触させる、というイメージです。
下げた分は最後に戻す
ただし「y座標を-1ずつ変える」を残したままにすると、キャラクターが少しずつ地面に沈んでしまいます。
そこで、ジャンプの判定が終わったあとに「y座標を 1 ずつ変える」を入れて、先ほど下げた分を元に戻します。

流れとしては、次のようになります。
y座標を -1 ずつ変える
↓
ジャンプできるか判定する
↓
y座標を 1 ずつ変えるこれで、見た目の位置は変えずに、地面に触れているかどうかだけを確認できます。
完成する処理のイメージ
最終的には、ジャンプ部分は次のような考え方になります。

ポイントは、ジャンプの条件を確認する前後で、
先にy座標を-1する
最後にy座標を+1する
という処理を入れることです。
なぜ「キーが押されていないまで待つ」を入れるのか
ジャンプ力を15にしたあとに「上向き矢印キーが押されたではないまで待つ」という処理を入れています。

これは、キーを押しっぱなしにしたときに、何度もジャンプ処理が実行されるのを防ぐためです。
もしこの処理がないと、地面に触れている間、上向き矢印キーを押しっぱなしにしただけで、何度もジャンプ力が設定されてしまうことがあります。
そのため、ジャンプしたら、一度キーを離すまで次のジャンプを受け付けないという形にしています。
まとめ
今回は、スクラッチで2段ジャンプをできないようにする方法を紹介しました。
今回の考え方をまとめると、次のようになります。

2段ジャンプが起きる原因
→ 上向き矢印キーだけでジャンプできてしまうから
対策
→ 上向き矢印キーが押された
かつ
地面に触れている
ときだけジャンプできるようにする
注意点
→ 沈み込み補正の影響で、地面に触れている判定がうまく取れないことがある
解決方法
→ 判定の直前にy座標を-1し、判定後にy座標を+1して戻すこれで、地面にいるときだけジャンプできる、基本的なジャンプ処理が完成します。
スクラッチのジャンプ処理は、単純に見えて、実はかなり奥が深いです。
ジャンプ力、重力、地面判定、沈み込み補正を組み合わせることで、より自然な動きを作ることができます。
ファイブボックスでは、スクラッチやUnityの個別指導オンラインレッスンを行っています。
「スクラッチでゲームを作ってみたい」
「Unityにも挑戦してみたい」
「自分の作りたいゲームを一緒に完成させたい」
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!