Scratchでキャラクター(スプライト)をつかって何かのプログラムを作ろうと思ったときに真っ先に思いつくのが『ジャンプ』ではないでしょうか?
そこで今回は、5つのジャンプのプログラムを比較しやすいように横並びにして動かしてみました。それぞれのジャンプの特徴とプログラミングの方法を見てみてください。
なお、今回紹介するジャンプの方法の中で私が実際に多用するのは「簡易版の重力ジャンプ」です。
この記事では、5種類のジャンプの特徴とそのプログラミングの方法が分かります。
完成品
完成した動き
それぞれのスプライトをクリック(またはタップ)すると、それぞれの方法でジャンプします。
ジャンプの種類は下記の5つです。
- シンプルジャンプ
- 物理の公式を使った重力ジャンプ
- 物理の公式を使わない簡易的な重力ジャンプ
- 二段ジャンプ
- 三段ジャンプ(三段以上のジャンプに応用ができる形)
使用したスプライト
スプライトは、ネコスプライトを複製したものを5つ使用します。
名称は「スプライト1」「スプライト2」・・・「スプライト5」としています。
完成したスクリプト
完成したスクリプトの全体です。
【スプライト1(シンプルジャンプ)のスクリプト】
【スプライト2(公式を使った重力ジャンプ)のスクリプト】
- v0:このスプライトのみ
【スプライト3(簡易版の重力ジャンプ)のスクリプト】
- ジャンプ力:このスプライトのみ
【スプライト4(二段ジャンプ)のスクリプト】
- ジャンプ力:このスプライトのみ
- ジャンプステータス:このスプライトのみ
【スプライト5(三段以上のジャンプ)のスクリプト】
- ジャンプ力:このスプライトのみ
- ジャンプステータス:このスプライトのみ
スクリプトの作り方
ここからは、それぞれのジャンププログラミングのポイントについて解説します。
シンプルジャンプの解説
シンプルジャンプは、上方向の動きと下方向の動きを別々に考えてつくっています。
まず、上方向の動きは「y座標を10ずつ変える」を15回繰り返すことで実現し、下方向の動きは「y座標を-8ずつ変える」ブロックで実現しています。数字を変えると、ジャンプの高さや速さを変えることができます。
また、常に同じ高さの地面から繰り返しジャンプさせるために、地面に埋もれてしまった場合は「y座標をー120にする」ブロックで元の高さに戻すスクリプトを追加しています。
公式を使った重力ジャンプの解説
こちらは、物理法則の上方(垂直)投射のときの高さを求める公式を適用した重力ジャンプです。
公式は下の式で表されます。
$$高さ=h_{0}+v_{0}t-\frac{1}{2}gt^2$$
$$h_{0}:現在位置(高さ)/v_{0}:初速度/t:経過時間/g:重力加速度(9.8m/s^2)$$
この高さを求める公式は、上方向の動きと下方向の動きを1つの式で表しています。
つまり、「y座標を~にする」ブロックの「~」の部分に公式を当てはめれば良いということになります。
簡易版の重力ジャンプの解説
公式を使った重力ジャンプの動きを緩やかになるように改良したのが、「簡易版の重力ジャンプ」になります。
最初に「(ジャンプ力)を~にする」ブロックでジャンプの上昇の勢いを設定します。
次に「~まで繰り返す」ブロックなどのループの中で「ジャンプ力」変数の値を減らしていきます。今回のスクリプトの中では「(ジャンプ力)を-2ずつ」変えるブロックの部分です。これがジャンプの上昇力をどのくらい弱めるか(下降する勢い)を決めます。
「ジャンプ力」変数の値を実際に座標に反映しているのは、「y座標を(ジャンプ力)ずつ変える」ブロックの部分だけです。
このように上方向の動きと下方向の動きを1つのブロックで表すことができます。
二段ジャンプの解説
二段ジャンプもわりとニーズがあるジャンプの方法のようなのでつくってみました。
下の図で青色の枠になっているスクリプトは、「簡易版の重力ジャンプ」と同じです。二重ジャンプで追加・変更が必要なのは、赤枠部分のスクリプトと定義ブロックに入れたところです。
まず「ジャンプステータス」変数に二段ジャンプをしても良い状態なのかを判別するための値を設定しておきます。今回は「1ならOK、0ならダメ」という意味で値を設定しています。
「二段ジャンプ」定義ブロックにジャンプのy座標を変化させる要素があるブロックを入れます。
定義ブロックに「もし(ジャンプ力<0)なら」がありますが、これはジャンプが上昇から下降に切り替わった瞬間を意味しています。この値を変えれば、ジャンプ中のどの位置で二段目のジャンプをさせるかをある程度コントロールできます。
「もし(ジャンプステータス=1)なら」は、二段目のジャンプをして良い状態を意味しています。その後すぐに「ジャンプステータスを0にする」ブロックを置いているので、三段目のジャンプが行われないようになっています。
「ジャンプ力を15にする」は、二段目のジャンプ力を意味しています。この数値で二段目のジャンプ力をコントロールしています。
再度「二段ジャンプ」定義ブロックを実行していますが、このときには上で設定した「ジャンプ力=15」が使われるので、1回目のジャンプ(ジャンプ力=25)より弱いジャンプになります。
ここで重要(でイミフ)なのが「二段ジャンプ」定義ブロックの中で「二段ジャンプ」定義ブロックを実行している部分ではないでしょうか?
このように自分の中で自分自身を再度呼び出して実行するプログラムのことを「再帰プログラム」といい、プログラミングのテクニックです。二段ジャンプはこのテクニックを使うと簡単に実現できます。
三段以上のジャンプの解説
あまり使うことはないと思いますが、三段以上のジャンプを行うときは二段ジャンプのプログラムをほんの少しだけ改良する必要があります。
まず、プログラムの変更ではありませんが「ジャンプステータス」変数を『2回目以降のジャンプの残り回数』に意味を変更します。(二段ジャンプのときは、「ジャンプステータス」変数の意味は二段ジャンプができる/できない、でした)
それに伴って、二段ジャンプができる条件も「もし(ジャンプステータス=0ではない)なら」に変更するのと、二段ジャンプができたなら残りのジャンプ回数も減っていくので「ジャンプステータスを-1ずつ変える」ブロックを追加します。
解説は以上です。
失敗しやすいポイント
失敗しやすいポイントは特にありません。
応用編
今回は応用編も特にありません。
まとめ
今回紹介したジャンプの方法のいずれかを利用すれば、だいたいやりたいジャンプの方法のヒントが見つかるのではないでしょうか?
この中では「簡易版の重力ジャンプ」が最も使いやすいと思います。場合によっては「二段ジャンプ」も組み合わせると面白いゲームがつくれるかもしれません。
もっと他にも『こんなジャンプの場合はどう作るの?』みたいなリクエストがあれば、フォームからメッセージを送っていただければ考えてみたいと思います。ネタが溜まれば第2弾の記事を書くかもしれません。
この方法は、上方向の動きと下方向の動きを個別に考えることができるので作りやすい反面、上昇も下降も一定の幅で動くので少し違和感のある動きになると思います。