Scratchのゲームを作っていると、物を落下させたり、壁で跳ね返らせる動きをさせたいことがあると思います。現実世界と同じように、ボールの空気抵抗による移動速度の減速や、跳ね返りによる速度減速など、どのようにコードに落とし込めばいいでしょうか。物理的な意味も考えながら、コードを解析してみましょう。
Bouncy Ball Physics
今回解析するのは 、 「Bouncy Ball Physics 」というプロジェクトで、Legomariobros さんが作成されたものです。
ボールをマウスでドラッグして離す動作
ボールをマウスでクリックした状態で、他の場所へマウスをドラッグしてから、マウスのクリックを解除すると、ボールは勢いよく進み出します。このときの速度を決めているのが、下記のコードです。ポイントは、変数「Drag?」でマウスが押されている状態を1,押されていない状態を0で表しています。この変数は、別のコードで使用します。X方向の速度(X velocity)とY方向の速度(Y velocity)は、マウスの座標と元々のボールの座標との差分にしています。速度を計算したあとは、ボールを「マウスのポインターへ行く」で移動させます。これを、マウスが押されている間はずっと実行します。
ボールが壁にぶつかったときの位置と速度
次のコードは、壁にぶつかったときのボールの位置と速度を設定しています。壁は上下左右の4箇所あり、コードも同様の内容のものが「もし~なら」で4つ書かれています。例として、1つ目のコードについて説明します。もし、右側の壁を通り越すX座標の場合は、そうならないように、217.5で制限をかけています。そして、X方向の速度を-0.8倍することで、移動方向を反転し、速度を80%に落としています。現実世界で例えると、ボールのエネルギーの20%が壁との衝突で失われて、80%のエネルギーで跳ね返っていることを意味しています。最後に、跳ね返りの音を「boing」の音で表しています。残りの3つのコードも同様の内容です。
ボールが壁にぶつかったときの音
跳ね返りの音量は、ボールの移動速度と相関を持たせるため、「(X velocityの絶対値 + Y velocityの絶対値 -2)%)」となっています。最後の-2は、各々のvelocityが0に収束せず、1になるため、0%になるように調整をしているだけです。
ボールの移動速度・落下(重力)・減速
ボールの見た目とボールの移動速度・落下(重力)・減速は、以下のコードでプログラムされています。まずは、見た目について。「ずっと」のループの中で、「コスチュームをBallにする」が実行されるため、変数Ballの値を変えると、即座にボールのコスチュームが変わります。「もしDrag?=0なら」は、マウスでボールをドラッグしていない状態の時を意味しています。もし、マウスでボールをドラッグしているときは、ボールの動きをさせたくないため、このブロックが使われています。「もしDrag?=0なら、でなければ」は、Ball =1は単色のボールですが、その他のボールは模様がります。模様があるボールは、速度に応じてボールを回転させるという見た目の動きをつけています。
ボールの移動については、「x座標を(x座標+X verocity)、y座標を(y座標+Y verocity)にする」で記述されています。現在のx,y座標から、X verocity,Y verocityの数値分だけ移動します。そして、ボールの移動が徐々に少なくなるように、0.99を掛け算しています。現実世界で例えると、ボールの空気抵抗を簡易表現したものです。y座標に関しては、Gravity*0.5を減算することで、重力による落下を簡易表現したものです。
最後の2つのブロックは、ボールの速度によって見た目を変えるもので、1つ目はボールの色、2つ目はボールの軌跡を描くペンの色の設定です。
ペンでボールの軌跡を描く
ペンは、ボールが移動する軌跡を描くためのものですが、変数(Trail, Color, Gravity, Ball)を画面に表示/隠すのコードがここに記載されています。スペースキーを押すとこで切り替えることができます。変数の役割は下記のとおりです。
Trail … 0:ボールの軌跡を描かない 1:ボールの軌跡を描かく
Color … 0:軌跡の色を変えない 1:軌跡の色を変える
Gravity … ボールの重力。数値が大きいほど重力が大きい。
Ball … ボールのコスチューム
変数TrailとColorは、初期値をともに0とします。Trailが0なので、ペンを上げた状態にします。同時に、ペンの太さや濃さもここで設定しておきます。
「ずっと」のループでは、ペンの色を「PenColor+115」にするコードがあります。PenColorについては、ボールスプライトで速度に応じて値を変えるコードが書かれています。もし「PenColor>200なら、PenColorを-200ずつかえる」とすることで、PenColorの値を1にリセットしています。
「message1」は、ボールスプライトから1ループに1回 送られてくるメッセージです。これを受け取ったとき、もしTrail=0ならペンを上げて軌跡をすべて消します。Trail=1のとき、Drag?=1ならペンを一旦あげます。Drag?=0なら、ペンの座標をBallの座標に移動させて、ペンを下ろします。
「cキーが押されたとき」は、軌跡を全部消します。
コメントを残す