パラリンピックが始まりましたね。コロナ禍においての開催は色々、議論あるところですが開催された以上、オリンピック同様にメダルラッシュを期待します。ということでScratchを使ってパラ砲丸投げゲームを作ってみました。スピードと角度を合わせてめざせ金メダル!
中身はこちら
ゲームの遊び方
スタートボタンを押すと投げるパワーと決めるゲージと投げる角度を決めるゲージが激しく動きますので、タイミングを合わせてクリックしてください。そのタイミングの角度とパワーで投球します。最大値が675、角度45°で投げるのが一番理想的です。
放物線プログラム
さて、この記事を見てくれている人がどのくらいの年齢の人かわかりませんが高校を卒業している人は押入れからホコリをかぶった数学と物理の教科書をひっぱってきましょう。まだ学生という方は、そういうもんなんだと聞いてください。
プログラムを書く上での前提知識
まず、物体の動く速度は次の公式で表されます。
ここで、今回のプログラムでは本当の世界における空気抵抗や摩擦抵抗などは考えないことにして、物体には重力しかかからないという条件で考えます。
そうすると水平方向(X方向)には何も力が加わらないので、質量保存の法則で物体の速度は最初に与えられた速度のままでずっと水平方向に進むことになります。
一方で、垂直方向(Y方向)には重力がかかります。そのため、物体の速度は初速に加え、経過時間に応じた重力加速度が加わり、ある時刻における物体の速度は加速度aの部分に、重力加速度が加わった値となるんですね。
そして、もう一つの概念がSin(サイン)/Cos(コサイン)です。投球が必ずしも真上や真横に投げられるわけではなく、斜め上に投げるというのが一般的です。この時、斜めに投げられた球の初速はどのように水平方向(X方向)と垂直方向(Y方向)に分解できるかというと、以下の図のように投げたときの角度とSin、Cosを使って表現できます。
この考えを利用して投球したあとに描く放物線は以下のようなイメージのもとに、ある地点の球の速度が計算されることになります。
一方、速度というのはある時間(移動時間)において点Aから点Bに移動した距離(移動距離)であるため、移動時間を細かくすればするほどきれいな放物線を描けることになります。おや、なんかここから前回勉強した微分の世界が絡んできそうな話になりますね。
これで、放物線を書くプログラムの準備が整いました。パラ砲丸投げゲームを作る前にシンプルに投球が放物線を描くプログラムをつくってみましょう。それがこちらです。
中身はこちら
操作説明
スタートボタンを押した後、投球角度を選べるので適当な値にセットしてマウスクリック(画面をタップ)すると投球が始まります。物理法則にのっとっているので投球角度45度の時が一番遠くまでとんでいきます。
放物線プログラムの説明
さて放物線プログラムの中身を解説します。
変数・配列
今回はこの画像のように7つの変数を使っています。変数のそれぞれはプログラムの中身をみて説明した方がよいので、まずはこういう箱を作ったということをみてとってください。
スプライトの説明
今回は放物線を描くボールだけのスプライトです。
プログラムの中身はこちらです。
さて、中身を解説しますと。プログラムを見やすくするために関数ブロックを作って初期化ブロックと初期値入力ブロックにわけています。初期化ブロックでは、球の初期位置と各種変数のリセット。初期値入力では初速とそれをX・Y方向に分解したもの、重力加速度、移動時間を定義しています。
なお、移動時間は物理用語に合わせてそうしていますが、どちらかというと描画間隔といった方がよいでしょうか。位置計算の処理を何秒に一回行うかというところをここで定義します。現実世界のように1秒としてしまうと、実行すると放物線が全く描かれずに直線になってしまいます。これを毎秒1回以下にしていくとどんどんギザギザな放物線を描くようになり、毎秒1/100回程度にするときれいな放物線になっていきます。
次に重力加速度です。物理の教科書では g = -9.8m/s2 とされていますが、この9.8をそのまま使うと同じようにきれいな放物線が描けません。というのも、Scratchの画面座標がX方向が-240~240、Y方向が-180から180となっているため9.8という数字では変化量が少なくて実行してもちっちゃな放物線しか描けないのです。そのため、mをcm換算して-980cm/s2とすることにします。また初速についても画面内いっぱいにきれいな放物線がかけるように670cm/sとします。
さて、本筋の投球プログラムですが、マウスを押されると初期値に基づいて投球が行われます。端についたら、つまり地面につくまで処理が繰り返されるというものとなっています。ここで、先の初期位置が(-240,-180)となっていなくて5座標程度ずれているのは、初期位置をこうすると0秒のタイミングで、端に触れているという条件が成立して反復処理が実行されなくなってしまうため、ボールの大きさ分、つまり5px程度ずらした位置を初期位置にしています。
そして、反復処理の中では移動時間(描画間隔)のたびに球がどこにいるのか?を計算してペンで描いていくという処理となります。移動時間の間にどのくらい、移動したの?という移動距離は小学校でも勉強しましたよね。以下の通り速度x移動時間で計算できます。
※厳密にいうと速さ(スカラー)と速度(ベクトル)は物理の世界では別物だけど、それを言い出すとややこしくなるので単純に速度x移動時間ととらえて書いています。
これをプログラムの中で表しているのですがあれ?と思う箇所があります。それは、水平方向も垂直報告も初速に時間をかけているのではなく瞬間の速度に時間をかけているの?というところです。そうこの処理です。
これは、まず考え方として、描画する点は、X,Y座標を求めたいのではなく、直前の座標からどのくらいX方向とY方向に移動したの?という値を知りたいのです、なので座標も変化もY座標を〇〇にする、ではなく〇〇ずつ変えるというブロックをつかってますよね。
この時、直前の描画からどのくらい移動したかは、どのくらいの時間で移動したかという移動時間を使って計算することになります。
最初にしめしたV = V0(初速)+ at の t は初速を測定した時間からの経過時間を表す t なんですね。なので、ここでつかうtは移動時間Δtであることに注意です。そして、Y軸の場合瞬間の時間は直前の速度+重力加速度×移動時間で計算できることになり、この瞬間の速度にさらに移動時間をかけると、移動時間で移動した距離(Y方向にずれた距離)が算出できるのです。
X軸の場合、加速度がないので単純に瞬間の速度=初速V0に移動時間(Δt)をかけるだけでことたりますね。
そして、この移動時間(Δt)を極限まで小さくすると、その瞬間の速度がわかる。つまりこれは分解する前のX方向とY方向のベクトルの和であるため、曲線の切片が瞬間速度となり、これは微分でもとめられる傾きになるんですね。どうです?前回の微分がここでつながったでしょう?お腹いっぱいですか?
パラ砲丸投げプログラムの説明
さて放物線を描く考え方が理解できたところでパラ砲丸なげゲームのプログラムの説明にはいりましょう。とは言え、メインどころは先の放物線を描くプログラムの部分で説明しています。追加要素としてはゲーム要素を高めるため
・背景に距離に応じた位置に金・銀・銅を描いた
・距離を20で割った
というところです。まず背景は単にそのような背景をつくったということで特にプログラム的な要素はありません。プログラムの中の背景をみてください。次に距離ですが、実際のオリンピック選手の世界レコードって20メートル強ぐらいなんですね。そのため、そのまま距離をだすと400mとか超人的な数字になるので、現実味を持たせるために最後に20で割っておきました。では、今回のプログラミングの注目である投球速度と投球角度をマウスのクリックにあわせるという部分だけを中心に解説しますね。
スプライトの説明
まずは投球角度を決めるスプライトです。このスプライトは×印が円に沿って0度から90度まで激しく移動します。そしてマウスをクリックしたら角度が定まって投球が始まるというものです。以下がコードとなります。(実際のコードはもう少し見た目の効果を増やすため複雑になっています。そのため機能に必要な最低部分だけを抜粋して記載しますね。)
ここで、ポイントは×印が円に沿ってぐるぐる動くところだとおもいますが、そこは角度を0から90度まで5度ずつうごかして、90度になるとまた0度に戻すという処理と、cos,sinを使って円の中心から常に一定の距離にいるようにしているというところです。
次に投球の初速を決めるためのパワーゲージです。こちらはバーが1つから6つになる、6枚の絵を組み合わせて反復処理の中で次々と次の絵(コスチューム)に切り替えることを行うことでゲージが増えたり減ったりを表現しています。角度のときと同じように初期値を600として15ずつふやし最高値の675を超えたらまた600に戻すという処理。マウスをおされたらゲージの見た目変化をとめ、同時に×印側でマウスをクリックされるとメッセージ1が飛んでくるので、その指示をうけたら初速にその瞬間のパワーの値をいれて、投球処理へメッセージをおくります。
ボールおよび人のスプライトについては、ボール部分は先に書いた放物線を描くプログラムの部分、人はコメントをしゃべるくらいなのでみればわかるかと思います。
まとめ
さて、今回はパラリンピックに合わせて放物線を描くということに挑戦してみました。前回のScratchで微分をイメージするという記事が具体的に今回役にたってきたのではないしょうか、今日(2021/8/24)から始まるパラリンピック。誰もが活躍できる社会をめざしパラアスリートをみなさん応援しましょう!
コメント