見出し画像

ファイブボックス 一分間スクラッチ講座 | #005 重力のある加速ジャンプの作り方 基本編

今回は、Scratchで「重力のあるジャンプ」を作る方法を解説します。

ジャンプにはいろいろな作り方がありますが、今回扱うのは、上に飛び出したあと、だんだん勢いが弱くなり、最後は重力で落ちてくるタイプのジャンプです。

ゲームでよく使われる、いわゆる「自然なジャンプ」に近い動きです。

下の動画は、不定期で配信している
「ファイブボックス 一分間スクラッチ講座」です。
ご興味のある方は、あわせてご参照ください。



1.今回作るジャンプの考え方

今回のジャンプでは、次の2つの変数を使います。

  • ジャンプ力

  • 重力

「ジャンプ力」は、キャラクターが上に移動する力です。

たとえば、ジャンプ力が 15 なら、キャラクターは上方向に大きく移動します。

一方で「重力」は、ジャンプ力を少しずつ下向きに変化させる力です。

ジャンプした直後は上向きの力が大きいですが、重力によってだんだん上向きの力が小さくなります。

そして最高到達点で上向きの力が 0 になり、その後は下向きの力が大きくなって落下していきます。

これが、今回作る「加速ジャンプ」の基本的な考え方です。


2.事前準備

まずは、背景を設定します。

今回は、着地判定を「色」で行います。

地面の色がはっきりしている背景を使いたいので、背景から Blue Sky を選びます。

ステージで「BlueSky」を用意

次に、変数を2つ作成します。

1つ目は、キャラクターのY座標の移動量を管理する

ジャンプ力

2つ目は、ジャンプ力に下向きの力を加える

重力

変数「重力」と「ジャンプ力」を用意

この2つの変数を使って、キャラクターを上に飛ばし、重力で落下させます。


3.ジャンプを開始するスクリプト

まず、旗が押されたときの初期設定を作ります。

旗が押されたら、キャラクターの位置を初期化します。

このとき、地面より少し上の位置に置いておくと確認しやすくなります。
サンプルでは、y座標を-100 にしています。(x座標は好きな位置で)

次に、変数「ジャンプ力」を 0 にします。

さらに、変数「重力」にマイナスの値を入れます。

今回のサンプルでは、重力を -1 にしています。

この重力の値を大きくすると、落下が速くなります。

たとえば、

  • 重力が -1 → ゆるやかに落ちる

  • 重力が -2 → 強めに落ちる

というイメージです。


4.上向き矢印キーでジャンプする

次に、上向き矢印キーが押されたときの処理を作ります。

ずっとの中で、

上向き矢印キーが押されたら
変数「ジャンプ力」を 15 にします。

これで、キャラクターに上向きの力が加わります。

ジャンプ力を大きくすると、高くジャンプします。

たとえば、

  • ジャンプ力 10 → 低めのジャンプ

  • ジャンプ力 15 → 標準的なジャンプ

  • ジャンプ力 20 → 高いジャンプ

という感じです。

ただし、このままだと上向き矢印キーを押し続けたときに、何度もジャンプ力がセットされてしまいます。

そのため、

上向き矢印キーが押されていない状態まで待つ

というブロックを入れ

これにより、キーを押しっぱなしにしても、ジャンプが連続で発生しにくくなります。

この2つのプログラムをくっつけて、ここまでのスクリプトは下のようになります。



5.ジャンプ力でY座標を動かす

次に、実際にキャラクターを上下に動かす処理を作ります。

ここでは、もう1つ別の「ずっと」を使います

ずっとの中で、

Y座標を「ジャンプ力」ずつ変える

という処理を入れます。

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の個別指導のオンラインレッスンを行っています。

ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!