8.1 重力のシミュレーション その1

M先生
クレーンゲームを完成させるとなると,今度は人形を作りたくなるよね.
Aさん
ですね.早速人形を描いてみました.
M先生
まず,人形が下に落ちて,床に当たったら止まるというプログラムを書いてみようか.どうすればいい?
Aさん
えっと,まず,Y座標を引く.それで人形の色と床の色が触れたときに引くのを止める.触れてないときにY座標を引く.
M先生
擬似言語で書くと?
Aさん
このようになります.
テスト
人形が床に触れている?
はい
(なにもしない)
いいえ
Y座標を引く
M先生
じゃあ実装してみて?
Aさん
できました.
M先生
なるほど.とりあえずこれでいいね.でも,問題なのは,これが本当に落ちているように見えないこと.なんでかな?
Aさん
重力 の 加速度 が考慮されていないのですね.本来ならば,ちょっとずつ速くなっていくはず.
M先生
では,今回は重力をうまくシミュレーションするにはどうすればいいかということを考えていこう.

M先生
では,まず始めに「速度」という変数を作ってくれる?
Aさん
分かりました.
M先生
速度はどのように変化していく?
Aさん
加速度が足されていきます.
M先生
そうだね.では,とりあえず加速度を「1」としよう.
Aさん
そうすると,次のようなプログラムが書けます.
M先生
うん.これで,速度が足されているね.でも一つ忘れていることがあるよ.
Aさん
あ,速度分だけ落ちるようにしないと意味がないですよね?
M先生
その通り.じゃあ実験してみよう.
Aさん
加速しているけど,何かゆっくりですね.
M先生
そうだね.スクリプトの実行回数や,加速度を調整してみよう.
Aさん
あ,下に消えてしまいました.
M先生
加速度が大きすぎると,床を突き抜けてしまうね.その場合は,ビューアーで画面範囲の値を指定して元に戻しておこう.床を突き抜けないようにするには,色判定ではなく,座標指定の条件文に変えると良い.
Aさん
こうですか.
M先生
そう.あと,今はとりあえずマウスで動かして実験しているから,「マウスの下にあるか」タイルを使って,マウスの下にある場合に速度を0に戻しておくプログラムを書いておくとよいね.
Aさん
できました.
M先生
よろしい.

練習問題8.1

このままでは,たいていの場合,床を突き抜けてとまってしまう.床を突き抜きぬけても,人形が床の上に止まるようにプログラムを修正しよう.

練習問題8.2

地球の重力加速度は9.8m/sである.実際の重力を忠実にシミュレートするプログラムを作ってみよう.

ヒント:加速度を9.8にしてもうまくいかない.単位に気をつけよ.(Squeakでの長さの単位はドットである.時間の単位は,刻み値の設定によって変わる.)

練習問題8.3

ジャンプする人のシミュレーションプログラムを作ってみよう.