今度は、水平移動から地面まで自然に落下させる動きをつくってみましょう。
ここでは「水平投射」という高校物理の公式が出てきます。最初はむずかしく感じるかもしれませんが、公式なんて覚えなくてもブロックに置きかえれば簡単に作れちゃいます。
この記事を読んでいただくと、スプライトを水平移動から斜め下方向に自然に落下するような動きをさせるスクリプトの作り方と上手くやるポイントが分かります。
スクリプトの作り方
完成した動き
水平にジャンプして崖から飛び降ります(無事着地)。
速さは変数にしたので自由に変えられます。
完成したスクリプト
ネコのスプライトのスクリプト全体です。
水平に動く部分と落下の部分でスクリプトを分けて作ってます。
- 重力加速度g:すべてのスプライト用 or このスプライトのみ
- よこ移動量x:すべてのスプライト用 or このスプライトのみ
- たて移動量y:すべてのスプライト用 or このスプライトのみ
- タイマー:すべてのスプライト用 or このスプライトのみ
- 初速度v0:すべてのスプライト用 or このスプライトのみ
スクリプトの説明
事前準備:「水平投射」の公式を確認する
高校の物理で学ぶ「放物運動の公式」の中に「水平投射(すいへいとうしゃ)」というものがあります。それは以下の式で表されます。
細かいところは分からないままで良いので何となく眺めておきましょう。
$$x座標=x_{0}+v_{0} \cdot t$$
$$y座標=y_{0}-\frac{1}{2}gt^2$$
$$x_{0},y_{0}:x,yの初期座標/v_{0}:初速度/t:経過時間/g:重力加速度$$
ポイント①:変数を定義する
今回は、7個の変数を使います。
少し多めですがそれぞれの意味を一応確認しておきましょう。ほぼ公式に対応しています。
- タイマー:経過時間を入れておく変数
Scratchに最初から用意されている「タイマー」ブロックは時間の進むスピードを変えられないので使いません。 - 初速度v0:よこ方向に動く初期速度を入れる変数
- 重力加速度g:現実と同じ9.8を入れておく変数
- よこ初期位置:スプライトの落下開始位置のx座標を入れる変数
- たて初期位置:スプライトの落下開始位置のy座標を入れる変数
- よこ移動量x:ある経過時間の初期位置からのx方向に移動した量を入れる変数
- たて移動量y:ある経過時間の初期位置からのy方向に移動した量を入れる変数
ポイント②:変数を初期化する
それぞれの変数を初期化(スタート直後の値を入れる)しておきます。
下の図の赤枠①の部分はスタート直後に設定しますが、赤枠②の部分は落下の動きが始まる直前にセットしておく必要があります。
これは、落下が始まった場所「x座標・y座標」をその後の座標計算の開始地点にする必要があるためです。
ポイント③:タイマーは変数をつかう
タイマーですが、もともとScratchに用意されている「調べるカテゴリー」の中にあるタイマー用ブロックは使いません。
なぜなら時間の経過速度が一定だからです(システム時間を計測しているので当然ですが)。時間が変化する間隔も好きに調整できるようにしたいので、ここでは「タイマー変数」を作ります。
落下を始めたときにタイマー変数の中身をゼロにします(リセットする)。
タイマー=経過時間は、たて方向・よこ方向それぞれの移動量を計算するときに重要な役割を果たしています。
ポイント④:たてとよこの移動量をそれぞれ分けて計算する
公式が示す通り、たて方向(y座標)とよこ方向(x座標)の移動量を分けて計算します。計算した移動量とx、yそれぞれの初期位置を加えると、その時点の座標が計算できます。
地面の色に触れるまでの間、計算を続けます。
なお、タイマー変数の値を変えると動くスピードをダイナミックに変えることができます。
ポイント⑤:地面のめり込みを直す
タイマーの値を大きくすればするほどy座標の計算結果の大きさが飛び飛びになります。そのことで地面に着地したときに地面にめり込んでしまうので、これを最後に強制的に直しています。
もちろん地面にめり込まない方法はあります(ヒント:「たて移動量y」を計算した結果が地面にめり込む位置なのかどうかを判定する)が、本題とそれてしまうので複雑なスクリプトになるのを避けました。
さあ、ここまで作れたら水平ジャンプからの自然な落下が完成してるはずです!
失敗しやすいポイント
スクリプトを組むにあたっていくつか注意点があります。
以下の作り方では上手く動きませんので当てはまってないか確認しましょう。
失敗パターン①:最初に「たてよこの初期位置」変数を初期化してしまう
「よこ初期位置」変数と「たて初期位置」変数の初期化を上の図のように、スクリプトの開始直後に行ってしまうと、スプライトがきれいに落下運動をしてくれません。
これらの変数は、プログラムの開始直後に初期化したい変数ではなく「落下する直前」に初期化したい変数なので、そのことを念頭に置いて正しい位置にセットしてください。
失敗パターン②:公式を一切無視してつくる
これでも失敗パターンとまでは言えませんが、あまり応用が効かない形になってます。特に高さを変えたくなった場合は、変数yの調整が面倒そうです。
このようなやり方で『それっぽく出来たからいいや』でもいいのですが、できればそこで満足せず一度は公式を使ったやり方も経験してみてください。
応用編
水平投射(すいへいとうしゃ)のスクリプトの応用としては、高い所から物を投げて的に当てるなどの動きをするゲームに使えると思います。
きちんと物理学の法則(公式)に則っているので、自然な動きが実現できるはずです。
※スペースキーで熊がボールを投げ、左右の矢印キーでネコを操作してボールを避けます。
まとめ
スプライトを水平移動から斜め下方向に自然に落下するような動きをさせるスクリプトの作り方と上手くやるポイントについて説明してきました。最後にポイントをまとめます。
- ポイント①:変数を定義する
- ポイント②:変数を初期化
- ポイント③:タイマーは変数をつかう
- ポイント④:たてとよこの移動量をそれぞれ分けて計算
- ポイント⑤:地面のめり込みを直す
どうでしたか?上手くできたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)