問題がありますが、どう説明したらいいのかわからないので描いてみました。
ご覧のとおり、衝突が検出されるとボールが跳ね返ります。角度を気にしないでください-私はちょうどそれをそのように描きました。しかし、ボールがパドルを通過して別の方向に離れることがあります。
なぜそれが起こるのですか?衝突を検出したら、vxを-vxに変更します。その場合はどうすればよいですか?yも変更しますか?しかし、パドルボールのどちら側がヒットしたかを確認するにはどうすればよいですか?
多分他のアイデア?
これは、ポンのクローンを作成する人々にとって非常に一般的な問題です。解決策は、衝突を検出すると、速度を逆にするだけでなく、ボールがパドルと交差しないようにボールの位置を変更することです。
そうしないと、ボールがパドル内に詰まり、各フレームで常にvx = -vx = vx=-vxが無効になる可能性があります。そのyの勢いがパドルを十分に上下に動かして逃げるまで、パドルを離れることはありません。
多くのことが問題を引き起こしている可能性があります。
特に、ボールが「ティック」または「フレーム」ごとに1ピクセルを超えて移動できる場合、衝突が検出されるまでに、ボールはパドルと数ピクセル以上交差する可能性があります。
次に、速度を変更してボールをパドルから逆バウンスしますが、新しい角度によっては、ボールがパドルから完全に離れるまでに数フレームかかる場合があります。したがって、次のティックでは、それはまだ交差しており、速度を再び逆転させています。これが異常に発生すると、ボールが最終的に反対側のパドルを離れ、まっすぐ飛んでいるように見える可能性があります。
交差点が最初に検出されたときに、そのパドルボールの組み合わせに「しばらく衝突しない」フラグを設定することをお勧めします。
関連する問題として、ボールが十分に速く進んでいる場合(特にx
、ボールがほぼ完全に水平に移動している場合など、ボールが通過するパドルが最も少ない場合など、そのコンポーネントが最も高い場合)、実際、ボールがパドルと物理的に交差しているフレームはありません。
これはすべてあなたのコードに依存しますが、私たちはそれを見ることができません。うまくいけば、上記はあなたにいくつかのアイデアを与えるはずです。
あなたの素晴らしい絵は、あなたが垂直衝突を検出していないことを私に示しています。y座標のx座標に対して行うのと同じことを行う必要があります。
これは通常、ボールの動きが速すぎることが原因です。1つのフレームが壁に移動し、次のフレームがすでに壁の後ろに配置されている場合。衝突は起こりません。ボールの弾道に沿ってさらに調べ、障害物をチェックすることで、それを否定することができます。
ポンを作るときに私が見つけた解決策は、左のパドルとの衝突が検出されたときにvx = abs(vx)を使用し、右のパドルとの衝突が検出されたときにvx = -abs(vx)を使用することでした。これにより、ボールが1回だけ跳ね返り、複数の跳ね返りによって引き起こされるパドル内の移動がなくなります。