1

私はこのクイックポンゲームを作成し、hitTestObjectを使用して衝突をチェックしています。とにかくすべてが長方形なので、問題にはならないはずです。ベクター内の各ボールは、フレームごとにパドルと衝突しているかどうかを確認しています。各ボールが半分ほど通過するまで衝突をトリガーしないのはなぜですか?enter_frameよりも頻繁に関数を呼び出すことはできませんか?十分な速さで更新されていないようです。

if (ball[i].hitTestObject(paddle)){

     // Flip
     ball[i] *= -1;
}

それの簡単な写真:

ここに画像の説明を入力してください

4

2 に答える 2

3

スムーズな動きではなく、瞬間的な位置をチェックするだけなので、ヒットテストを実行するときにボールがそこにあるからだと思います。言い換えると、1つのフレームで、ボールの端がパドルから5ピクセル離れている場合、ヒットテストはfalseになります。次にボールが次のフレームで8ピクセル移動すると、ヒットテストは真になりますが、ボールのエッジはパドル内で3ピクセルになります。

テストするこのような単純なフラットエッジがある場合、これらの線に沿って何かを行う傾向があります(ボールにspeedY変数radiusがあり、paddle.y==パドルの前縁がある場合)。

if (ball.y + ball.radius > paddle.y) {
    // Mirror the ball's speed
    ball.speedY *= -1;

    // Mirror the ball's location as if it had bounced on the edge
    // by moving it back by the same distance it went past.
    ball.y -= (ball.y + ball.radius - paddle.y) * 2;
}
于 2013-01-29T22:33:07.990 に答える
0

ここで行う必要があるのは、衝突が発生したときにボールがパドルの端に当たるようにボールの位置を更新することです。

現在発生している問題は、ボールがフレームあたり12ピクセルで移動し、バットから2ピクセル離れている場合、ボールはバットの端を次のフレームで10ピクセルバイパスし、ビジュアルを提供することです。あなたが見ている結果。

if( /* your hit detection */ )
{
    // Move the ball so that it's sitting against the paddle here.
    //
}
于 2013-01-29T22:34:11.050 に答える