0

ボールがパドルに正しく当たると、ボールが内側にロックされてリリースできないという問題があります。プレイヤーのパドルで時々発生しますが、あなたがそれを制御できるので、あなたがしなければならないのはそれを動かすことだけであり、それは逃げます。コンピューターはボールを完全に追跡するため、ボールが中に入ると逃げることができず、このビデオで何が起こるかがわかります。これは、フレームレートを上げた場合にのみ発生します。フレームレートが非常に低い場合は、エラーが発生してパドルを「通過」し、ポイントが獲得されます。少なくともこの場合、それは目立ったバグではなく、ゲームはプレイし続けます。

当然、フレームレートをできるだけスムーズにしたいので、これを整理したいと思います。これが非常に単純な衝突検出のための私のコードです。UIImageViewsを使用します。

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //hits the "top" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

    if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
    {
        if (ball.center.y > computerPaddle.center.y) //hits the "bottom" of the computer paddle
        {
            AudioServicesPlaySystemSound (hitSound);
            ballVelocity.y = -ballVelocity.y; // turn ball around if collide
        }
    }

助けてくれてありがとう。

4

5 に答える 5

4

コードの残りの部分を見ることなく、これは単なる推測ですが、おそらく起こっているのは、ボールの速度が継続的に前後に反転することです。ボールが当たった後、ボールをパドルの外に移動する必要があります。そうしないと、「衝突間の最小時間」が必要になります。

于 2009-10-13T22:04:05.373 に答える
3

上記の答えに加えて、あなたのボールが実際にパドルに入ることを決して許されるべきではありません。具体的には、ボールがパドル内にある場合は、y速度を切り替えると同時に、その位置をパドルのすぐ外側にリセットする必要があります。

具体的には:

if (CGRectIntersectsRect (ball.frame, playerPaddle.frame))
{
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = playerPaddle.frame.origin.y - frame.size.height;
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}

if (CGRectIntersectsRect (ball.frame, computerPaddle.frame))
{               
    AudioServicesPlaySystemSound (hitSound);
    CGRect frame = ball.frame;
    frame.origin.y = CGRectGetMaxY(computerPaddle.frame);
    ball.frame = frame;
    ballVelocity.y = -ballVelocity.y; // turn ball around if collide
}
于 2009-10-14T03:02:04.467 に答える
0

追加の条件が必要でした。

if (ballVelocity.y > 0 && CGRectIntersectsRect (ball.frame, playerPaddle.frame))
    {
        if (ball.center.y < playerPaddle.center.y) //player
        {
            AudioServicesPlaySystemSound (volleyFileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }

    if (ballVelocity.y < 0 && CGRectIntersectsRect (ball.frame, computerPaddle.frame)) //computer
    {
        if (ball.center.y > computerPaddle.center.y)
        {
            AudioServicesPlaySystemSound (volley2FileID);
            ballVelocity.y = -ballVelocity.y;
        }
    }
于 2009-10-13T23:44:58.577 に答える
0

これを処理する最も簡単な方法は、パドルとの衝突後、ボールの速度ベクトルが常にパドルの中心点から離れる方向を向くようにロジックを追加することだと思います。そうすれば、ボールがパドルと「再び衝突」したとしても(イベントループの次のティックでボールが内側に出すぎて再び出ることができないため)、2回目の「バウンス」の後もパドルから離れ続けます。 。

于 2009-10-14T03:10:41.780 に答える
0

この問題は、ボールがパドルの内側に引っ掛かるという問題に似ていました。これを解決するために私がしたことは、ブール値を作成することでした。衝突がある場合、ブール値はtrueに設定されます。ボールが壁に当たると、ブール値はfalseに設定されます。Rectangle Intersectionをチェックする条件ステートメントの中に、衝突がfalseに設定されているかどうかを確認するチェックを追加します。

したがって、最終的に何が起こるかはこれです:

  • ボールがパドルに当たり、ブール値がtrueに設定されます。
  • ボールの速度が逆になります
  • 衝突検出を実行しようとすると、ブール値がtrueであるため実行されません。
  • ボールが壁に当たって跳ね返り、ブール値がfalseにリセットされます
  • ボールが他のパドルと衝突し、ブール値が再びtrueに設定されます

これを試して、どのように機能するか教えてください。

-ブランドン

于 2010-02-01T18:41:52.393 に答える