DXライブラリ6 マウスで玉遊び(応用)
DXライブラリ6 マウスで玉遊び(応用)
直線の方程式の一般形と、点と直線の距離の方程式を使い、玉が斜めの壁に当ると、当った位置で止まるプログラムを作成します。
玉が、斜めの壁に当ったならば、跳ね返るようにしたいのですが、その前に、跳ね返る角度を求めます。2点の座標を結ぶ線と水平線の角度は、atan2関数で求めることができます。atan2関数と反射の法則を使い、玉の跳ね返る角度を表示するプログラムを作成します。
跳ね返る角度が求まったならば、その方向に玉を動かします。壁に当る前のスピードと、壁に当った後のスピードは同じにして、進む角度だけを変えます。XY方向に進むスピードはcos関数とsin関数で求めることができます。
「6-3 斜めの壁を跳ね返る」で作成したプログラムを実行すると、時々、跳ね返らず、壁をすり抜けてしまう場合があります。このバグの原因を説明して、バグを取り除く修正をします。
斜めの壁を跳ね返るロジックは、垂直の壁や水平の壁にも適用できます。全ての壁を、同じロジックで跳ね返させるように、プログラムを修正します。
真ん中に三角形の壁を作ると、玉が見えない壁に閉じ込められた状態になってしまいます。
この問題を解決するためには、玉の当った位置が、壁の開始位置と終了位置の間にあるかを判定しなければなりません。円(玉)と直線(壁)の交点を求めます。交点は、直線の方程式と円の方程式の解を求める数学の問題を解くことで求まります。
二次元方程式の解の公式も使い求めた式を、プログラムに組み込むことで、真ん中にある障害物にも、玉が跳ね返るようになります。