重力は速度を少しずつ増やす
速度は、1フレームに何ピクセル動くかを表す数です。重力は、その速度を毎フレーム少しずつ増やす数で、落ちるほど速くなる動きを作ります。
物理の式を使わなくても、足し算の繰り返しだけで、自然な落下が作れます。
このレッスンのゴール
メモ
速度と重力を使って、ものを1フレームずつ動かせる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 速度 | 1フレームに動く長さ | |
| 重力 | 毎フレーム、速度に足される数 | GRAVITY |
| ピクセル | 画面を作る、小さな点の1つ | |
| ステップ | 1フレーム分の計算 | |
| 反発係数 | はね返ったあとに、速さが残る割合 |
学生が入力するセルは、このプレビューでは空白です。
速度を増やしてから、位置を進める
ラボの星は、毎フレーム、2つの計算を順に行います。まず、速度に重力を足します。次に、その速度の分だけ、位置を下へ進めます。
重力が足すのは位置ではなく、速度です。だから、星は落ちるほど速くなります。
例: 重力0.15で落ちる星
| フレーム | 速度 | 位置(上からの長さ) |
|---|---|---|
| 1 | 0.15 | 0.15 |
| 2 | 0.30 | 0.45 |
| 3 | 0.45 | 0.90 |
| 4 | 0.60 | 1.50 |
| 5 | 0.75 | 2.25 |
学生が入力するセルは、このプレビューでは空白です。
例: 星を5フレーム落とす
<p id="out"></p>
ラボで、10フレーム分の落下を見る
ラボのスクリプト fall.py は、game.js の GRAVITY を読み、星を10フレーム落とします。スクリプトが出す言葉は英語です。
最初に gravity 0.15 と出て、次に frame 1 から frame 10 まで、速度 speed と位置 y が1行ずつ出ます。10フレーム目は、速度1.50、位置8.25です。
星の落下を10フレーム見る
docker exec jupyter python3 steps/fall.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
落ちた長さは速度の合計になる
位置は、これまでの速度を全部足した数です。10フレーム目までの速度は、重力の1倍から10倍まで増えます。
1から10までの合計は55なので、落ちた長さは、0.15の55倍で8.25です。表の最後の行と一致します。
例: 1からnまでの合計
| フレーム数 | 1からその数までの合計 | 落ちた長さ |
|---|---|---|
| 3 | 6 | 0.90 |
| 5 | 15 | 2.25 |
| 10 | 55 | 8.25 |
学生が入力するセルは、このプレビューでは空白です。
速度と位置を変える行を探す
grep -n star.speed は、star.speed を含む行を出します。ラボを変えていなければ、74行目と75行目の2行が出ます。1行目が速度を増やす行、2行目が位置を進める行です。
速度と位置の行を探す
docker exec jupyter grep -n star.speed game/game.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
重力は、位置を毎フレーム同じ長さだけ動かす数だと考える人がいます。重力が足すのは速度です。位置の動きは、フレームごとに大きくなります。位置に直接足すと、一定の速さで落ちる、不自然な動きになります。
はね返りは向きを逆にして弱める
ラボの星は、はね返りません。下まで落ちると命が減って消えます。ここでは、ボールが床ではね返る動きを、このレッスンの例として作ります。
床に着いたら、位置を床に戻します。速度の向きを逆にして、反発係数を掛けます。
例: 床ではね返るボール
<p id="out"></p>