0

私は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空間の方向の角度に基づいて衝突/跳ね返る他の方法を知りたいです(単純なポン環境では摩擦や重力はありません)。

4

1 に答える 1

1

私の推測では、これらの角度では、何らかの理由で、条件が2回(したがってさらに何度も)満たされます。問題は、ボールの位置をチェックしているだけで、バウンドするためには、ボールも正しい方向に進まなければならないということです。

これを試して

if(x - radius < 0 && speed_x < 0 || x + radius > S->w && speed_x > 0 || y - radius < 0 && speed_y < 0 || y + radius > S->h && speed_y > 0) ...

ここで、speed_xとspeed_yはsin(方向)とcos(方向)であり、おそらくスワップされているか、いくつかの係数があります。x値とy値を更新する場所からそれらを取得します。

于 2012-07-16T06:36:43.717 に答える