マリオのようなアクションゲームをScratch作ろうと思ったときに、必要になるのが、
「止まる」プログラムです。
地面にふれていたら、それ以上下に落ちないように「止まる」
横移動中、かべに触れたら「止まる」
ジャンプ中、頭とブロックが触れたら、それ以上上に行かずに「止まる」
前回は、「横移動中、かべに触れたら止まる」プログラムでした。
今回は、「重力と着地」のプログラムです。
今回の記事も、下のYouTube動画を参考にさせていただきました。
キッズITチャンネル様、ありがとうございます!
準備:前回のおさらい
今回のお話は、前回からの続きです。前回をまだご覧になってない方は、そちらからご覧いなったほうがよりわかると思います。

壁などの障害物は、スプライト「地面」で作りました。

これらをもとに、「重力と着地」のプログラムを作っていきます。
定義ブロック「重力処理」を作る
定義ブロックを作り、その中にプログラムを収めます。そうすることで、実際に重力を使いたい場所には、定義ブロックだけを入れればよくなり、プログラムが読みやすくなるからです。
作ろときには、「画面を再描画せずに実行する」にチェックを入れてください。

変数「落ちるスピード」を作る
重力を表現する、ということは、落ちる時間が長くなるほど、落下スピードが速くなっていく、ということです。今回は、「落ちるスピード」という変数を作り、その数値を変化させることで、自由落下らしく見せるプログラムにします。
重力のプログラム
とてもシンプルです。

これだけ。
スプライトの縦の動きは、y座標で表現します。
落ちる→下に移動する→y座標の値が減少
「落ちるスピード」が「増えた」時、y座標の「減り方」が大きくなるわけなので、
「落ちるスピード」に−1をかけて、値を負にします。
あとは、その値ずつy座標が変化すればいいだけなので、これで重力表現は完成です。
しかしこれだけだと、地面を突き抜けて画面下まで落ちていったしまいます。
そこで、地面に触れたときの処理が必要になってくるわけです。
地面に着地するということは
では、地面に着地するということは、動きがどうなればいいのでしょう?
答えは、
「地面に触れた時、落下が止まればいい」です。
落下が止まる、ということは、落ちるスピードが0になる、ということ。
つまり、「落ちるスピード」=0にすれば良い、というわけです。
逆に、地面に触れていなければ、落下スピードはどんどん大きくなるわけなので、
「地面に触れていなければ、落下スピードが大きくなる」ことも条件に入れていきます。
「もし〜でなけれれば」ブロックを使います。

もうひと工夫
先ほどのプログラムを組めば、ひとまず完成なのですが、実は、一つ問題があります。
それは、落下スピードによっては、地面の上スレスレにスプライトが止まらずに、少しだけ地面に埋まるような形で止まる場合があることです。
このままでは操作できなくなるので、どんな高さから落ちても、地面にめり込まずに着地するようにプログラムを追加します。
これは、前回のx座標に行った処理と同様です。
地面と触れている間ずっと=「地面に触れた」ではない、まで繰り返すというプログラムを追加します。

y座標は、増えれば上へ移動するので、地面に触れている間ずっと、y座標を1ずつ変えるを繰り返してもらえば、着地したような表現になります。
完成、終わりに
出来上がった重力と着地のプログラムは、以下のようになります。

前回の仕上げで使った「ずっと」のブロックに、「重力処理」ブロックを追加して、完成です。

これで残るは、「ジャンプ」の処理です。それは次回の記事に譲ります。
さのプログラミング教室は、「はぐくもう!つなげるちから」が合言葉の教室です。
同じ時間のクラスには、5人程度のお子さんが入室しますが、一人一人の興味・進度に合わせた課題を提供しますので、自分のペースで学ぶことができます。学習過程があり、同じスタート地点からスタートしますが、理解度やがんばりに応じて、どんどん次のステップへ進むことができます。
レッスンを無料で体験できます。
LINE公式に入り、「無料体験申込」を
タップしてお申し込みください。
