ファイブボックス 一分間スクラッチ講座 | #005 重力のある加速ジャンプの作り方 基本編
今回は、Scratchで「重力のあるジャンプ」を作る方法を解説します。
ジャンプにはいろいろな作り方がありますが、今回扱うのは、上に飛び出したあと、だんだん勢いが弱くなり、最後は重力で落ちてくるタイプのジャンプです。
ゲームでよく使われる、いわゆる「自然なジャンプ」に近い動きです。
下の動画は、不定期で配信している
「ファイブボックス 一分間スクラッチ講座」です。
ご興味のある方は、あわせてご参照ください。
1.今回作るジャンプの考え方
今回のジャンプでは、次の2つの変数を使います。
ジャンプ力
重力
「ジャンプ力」は、キャラクターが上に移動する力です。
たとえば、ジャンプ力が 15 なら、キャラクターは上方向に大きく移動します。
一方で「重力」は、ジャンプ力を少しずつ下向きに変化させる力です。
ジャンプした直後は上向きの力が大きいですが、重力によってだんだん上向きの力が小さくなります。
そして最高到達点で上向きの力が 0 になり、その後は下向きの力が大きくなって落下していきます。
これが、今回作る「加速ジャンプ」の基本的な考え方です。
2.事前準備
まずは、背景を設定します。
今回は、着地判定を「色」で行います。
地面の色がはっきりしている背景を使いたいので、背景から Blue Sky を選びます。

次に、変数を2つ作成します。
1つ目は、キャラクターのY座標の移動量を管理する
ジャンプ力
2つ目は、ジャンプ力に下向きの力を加える
重力

この2つの変数を使って、キャラクターを上に飛ばし、重力で落下させます。
3.ジャンプを開始するスクリプト
まず、旗が押されたときの初期設定を作ります。
旗が押されたら、キャラクターの位置を初期化します。
このとき、地面より少し上の位置に置いておくと確認しやすくなります。
サンプルでは、y座標を-100 にしています。(x座標は好きな位置で)
次に、変数「ジャンプ力」を 0 にします。
さらに、変数「重力」にマイナスの値を入れます。
今回のサンプルでは、重力を -1 にしています。
この重力の値を大きくすると、落下が速くなります。
たとえば、
重力が -1 → ゆるやかに落ちる
重力が -2 → 強めに落ちる
というイメージです。

4.上向き矢印キーでジャンプする
次に、上向き矢印キーが押されたときの処理を作ります。
ずっとの中で、
上向き矢印キーが押されたら
変数「ジャンプ力」を 15 にします。
これで、キャラクターに上向きの力が加わります。
ジャンプ力を大きくすると、高くジャンプします。
たとえば、
ジャンプ力 10 → 低めのジャンプ
ジャンプ力 15 → 標準的なジャンプ
ジャンプ力 20 → 高いジャンプ
という感じです。
ただし、このままだと上向き矢印キーを押し続けたときに、何度もジャンプ力がセットされてしまいます。
そのため、
上向き矢印キーが押されていない状態まで待つ
というブロックを入れ

これにより、キーを押しっぱなしにしても、ジャンプが連続で発生しにくくなります。
この2つのプログラムをくっつけて、ここまでのスクリプトは下のようになります。

5.ジャンプ力でY座標を動かす
次に、実際にキャラクターを上下に動かす処理を作ります。
ここでは、もう1つ別の「ずっと」を使います
ずっとの中で、
Y座標を「ジャンプ力」ずつ変える
という処理を入れます。

ジャンプ力が 15 なら、上に15ずつ移動します。
ジャンプ力が 0 なら、上下には動きません。
ジャンプ力が -10 なら、下に10ずつ移動します。
つまり、ジャンプ力の値によって、キャラクターの上下移動が決まります。
6.空中では重力をかける
次に、地面に触れているかどうかを判定します。
今回は、地面の色を使って判定します。
Scratchの色判定ブロックで、スポイト機能を使い、背景の地面の色を取得します。
もし地面の色に触れていたら、
ジャンプ力を 0 にする
ようにします。
これで、地面にいるときは下に落ち続けなくなります。
反対に、地面に触れていないとき、つまり空中にいるときは、
ジャンプ力を「重力」ずつ変える
ようにします。
たとえば、重力が -1 の場合、
ジャンプ力は次のように変化します。
15
14
13
12
11
……
このように、上向きの力が少しずつ弱くなります。
そして、やがて
0
-1
-2
-3
……
となり、今度は下向きに落下していきます。
これで、重力が働いているようなジャンプになります。

7.なぜ「ずっと」を2つ使うのか
今回のスクリプトでは、「ずっと」を2つ使っています。
1つ目のずっとでは、キー入力を確認します。
もう1つのずっとでは、キャラクターの上下移動と重力の処理を行います。
なぜ分けるのかというと、キー入力側のスクリプトには、
上向き矢印キーが押されていない状態まで待つ
という待ち時間があるからです。
もし、移動処理とキー入力処理を同じずっとの中に入れてしまうと、待っている間、移動処理も止まってしまいます。
そのため、継続して動かしたい処理は、別のずっとに分けて作ります。
Scratchでは、複数のスクリプトを別々に作ることで、キー入力の確認とキャラクターの移動処理を同時に動かすことができます。
専門的には、このように複数の処理を同時に進める考え方を「並列処理」と呼ぶことがあります。
8.動きを確認してみよう
ここまでできたら、いったん動きを確認してみましょう。
上向き矢印キーを押すと、キャラクターが上にジャンプし、重力で落ちてくると思います。
ただし、この段階ではまだ問題があります。
キャラクターの初期位置や落下速度によっては、地面に少し沈んでしまうことがあります。

9.地面に沈んでしまう理由
Scratchの「ずっと」の中では、1秒間に何十回も処理が行われています。
この1回1回の処理を、ゲームではよく「フレーム」と呼びます。
たとえば、キャラクターが地面の少し上にいるとします。
このとき、まだ地面には触れていません。
しかし、ジャンプ力が -15 だった場合、次のフレームでキャラクターは一気に15下へ移動します。
すると、地面に触れるだけでなく、地面の中に少し沈んでしまうことがあります。
つまり、
地面に触れる直前の位置から、一気に下へ移動してしまう
ことが原因です。
10.次回は沈み込み補正
今回の基本編では、重力のあるジャンプを作るところまで解説しました。
ただし、このままだと、落下速度が速いときに地面へ沈み込んでしまうことがあります。
そこで次回は、
スクラッチの加速・重力ジャンプ 沈み込み補正編
として、沈んだ分を上に戻す処理を解説します。
ジャンプ処理は、ゲーム作りでとてもよく使う基本です。
今回の内容を理解しておくと、アクションゲームや横スクロールゲームを作るときにかなり役立ちます。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!