私はc++とSDLを使用してPongクローンを作成中です。
角度に基づいてボールの衝突と跳ね返りを作ろうとしています。私はそのようなメソッドを正常に作成しましたが、90度、180度、270度、または0度に非常に近い角度で失敗するため、多少の遅れが生じ、バウンスがそれほど正確/正確ではありません。
これは、画面のすべての境界内でボールをバウンドさせるコードです。
void Ball::wall_collision(SDL_Surface *S){
//bounds of the screen
if(x - radius < 0 || x + radius > S->w || y - radius < 0 || y + radius > S->h){
// add 2*pi rads to current direction
direction = direction + d_pi;
}
}
もちろん、このコースは完全に失敗するわけではなく、ボールは正しく跳ね返りますが、前に宣言したように、180,0,90,270度に近い角度で遅れたり、不適切に跳ねたりすることがあります。
もう1つ、「方向」(ラド単位のボールの方向)および「d_pi」(円周率が2倍になる)変数を浮動小数点数として宣言しますが、d_piの10進精度が6.28318531ラジアンなどの場合、衝突は完全に失敗しますが、バウンスは発生しません。 「d_pi」を6.0や6.1のようなものに変更すると、衝突が機能します。そのエラーが発生する理由はわかりませんが、新しい方向を計算するときに不正確になります。
その「d_pi」変数の問題を修正する方法、または2D空間の方向の角度に基づいて衝突/跳ね返る他の方法を知りたいです(単純なポン環境では摩擦や重力はありません)。