2018年3月9日金曜日

Scratchでプログラミング その22 学校教材っぽいやつ リンゴが地面で跳ね返る

Scratchの使い方解説です、今回の難易度はEasy
前回のリンゴの落下シミュレーションの続きです。

記事をまとめたページはこちら。

前回は地面に落下するリンゴのシミュレーションをしました。
今回は地面で跳ねるようにします。

ものが地面に当たると跳ね返りますよね。
跳ね返るときは反発係数(だったかな?)によってどのくらい跳ねるかが変わります。


前回作成したプログラムです。
ここに今回は追記していきます。



0.目次


  1. 地面に当たる
  2. 跳ね返りを表現
  3. 当たり判定の計算方法


1.地面に当たる

地面に当たるとは、どういうことでしょうか?
リンゴの位置が、一定の高さになったとき地面に落ちたと考えることにします。

画面の下のあたりのY座標は-150くらいでした。
ですので、Y座標がー150より小さくなった場合に地面に当たったと判定します。

2.跳ね返りを表現

跳ね返ると、リンゴはどうなるでしょう?
地面にあたった瞬間に、いままで下方へ進んでいたリンゴは上方へ移動していきます。

これを公式で表現すると、上へものを投げたのと同じですね。
ここで先に用意していた変数の値を、条件に見合うように変更します。

まず、初期位置を変更します。
先ほどまでは天井が初期位置でしたが、跳ね返るので初期位置を地面に変更します。
地面はY座標なのでー150になります。

次に初速度を変更します。
最初は自由落下だったので初速度は0でしたが、跳ね返ったので最初から速さがあります。
今回は跳ね返った瞬間の速度をー0.6倍した値に変更しています。
マイナスがつくのは、反対方向(上方)へ向かう速度に変更するためです。
0.6は反発係数ですが、特に意味はありません。
リンゴの反発係数は知らないので、仮の値を設定しています。
実際のリンゴに近づけるなら、もうちょっと数値を変えてみたら良いと思います。

最後に条件を地面からスタートに変更したので、経過時間をリセットします。

プログラムにするとこんな感じです。


最初の判定式はy座標<-151としています。
これは俗に言うあたり判定をおこなっています。
プログラムを正しく動かすには重要なのですが、初心者には難しいと思うので、下に追記で書いておきます。


この追加したブロックを、シミュレーションの最後に追加しました。

これで完成!
リンゴが地面で跳ねるようになりました☆

実際のサンプルがこちらになります。
https://scratch.mit.edu/projects/207611887/


3.当たり判定の計算方法

ここからは興味がある人用です。
今回のプログラムでの地面に当たったかどうかの判定式はy座標<-151としています。


これは地味に重要です。
地面をー150と設定したのに、なぜy座標=-150じゃないのでしょうか?

まず演算が=(イコール)を使用しないのは、y座標が必ずー150ジャストになる保障がないからです。
位置の計算結果は整数になるわけではないので、計算のタイミングでy座標は-150.1などとなることもあります。ですので地面よりも低い位置として不等号での判定をしています。

また判定式にはー150ではなく-151を使用しています。
そして、条件にあった場合に、Y座標をー150に変更しています。
これは、連続で跳ね返り処理が行われないようにするための対策です。

シミュレーションでは少しずつ時間を進めながら、繰り返し位置を計算していきます。
今回は、地面に跳ね返った瞬間に速度にー0.6を掛けています。

条件によっては、跳ね返った計算のあと、次の計算までにリンゴの位置が-150まで達していない可能性があります。
その場合、連続でリンゴの跳ね返り処理が繰り返しされてしまいます。そうなると計算のたびに速度の符号が反転していきます。
これは意図した動きではないので、跳ね返り処理を行う際には、位置を判定式の範囲外であるー150に変更しています。
うーん、言葉ではわかりにくいですね。。。
詳しく考えたい人は、この条件を書き換えてプログラムを作ってみてください!