跳ね返る向きを考えよう ボールゲーム(2)

Ball Program x,y座標と向きを調べる
Ball Program

今回は、Scratchで使われている「もし、端に着いたら跳ね返る」について考えてみようと思います。

端についた時の、x座標、y座標、向き をリストに保管して確認してみます。

  1. Scratchの変数の所でxx、yy、angle の3つのリストを作ります。
  2. Ballのx座標を0,y座標を0、向きを45度にする。
  3. 端に着いた時に、各リストに値を入れて保管しておく。
  4. 適当なところで止める。(15データくらい)
  5. xxリストにマウスの矢印を置いて右クリックするとメニューが出てきます
    「書き出し」をクリックしてTXTファイルに書き出します。
    yy、angleも同様に。

リストは複数のデータを保管できます。こんな風に同じ種類のデータをたくさん保管しておけるのでとても便利です。リストの何番目って指定もできるのでいろいろな使い方が考えられます。

Ballが端で跳ね返った軌跡
Ball-locus

5.で書き出したファイルをエクセル(表1)に読み込んで上のようなグラフを書きました。

右の(表2)に端に触れる前の向き、跳ね返った時の向き、ボールゲームで使った数式
「180-端に触れる前の向き」を比較する表を作りました。

右端と左端にBallが着いて跳ね返った時の向きが一致していません。
例えば、2番目に跳ね返った時、135°→-135°になっているのに、「180-端に触れる前の向き」で計算した値だと45°になっています。
Scratchでは-135°の向き(斜め下)に跳ね返るのに、45°(斜め右上)に跳ね返ってしまっていました。

右端、左端に着いた時は、「向き*(-1)」(向きのプラスとマイナスを反対)にするとよさそうです。
(“*”はかけ算を表しています)

180度を超えた向きは、スプライトの向きの所に、225、315を入力してみてください。
0から180度、0から-180度の間に修正してくれています。
従って、上端、下端についてはこのままでよさそうです。

Ballが端で跳ね返るプログラムを作ってみる
Ball Program

右端と左端にBallが着いたことを判断するのに、端に着いた時のx座標が表1の値から219より大きいとしています。とりあえず「-219~219の間は端に当たってないかな」と考えて絶対値を使って判断しています。
少し誤差は出てしまいますがまあまあいい感じかな。

「反射の法則」についても少し調べてみたのですが、なかなか難しい😅。
なので、実際のScratchの「跳ね返る」ブロックをもとに考えてみました。わかりそうなところから始める感じです。

またゲームでは同じように跳ね返るより、少しづつ向きを変えてみるのも面白そうです。