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

这个问题类似于我遇到的球被夹在桨内的问题。我为解决这个问题所做的是创建一个布尔值。当发生碰撞时,布尔值设置为 true。当球撞到墙上时,布尔值设置为假。在我们检查 Rectangle Intersection 的条件语句中,我添加了一个检查以查看碰撞是否设置为 false。

所以,最终会发生的是:

  • 球击中桨,布尔值设置为真。
  • 球上的速度是相反的
  • 当碰撞检测尝试执行时,它不是因为布尔值为真
  • 球从墙上反弹,布尔值重置为 false
  • 球与另一个桨碰撞,布尔值再次设置为真

试试这个,让我知道它是如何工作的。

-布兰登

于 2010-02-01T18:41:52.393 回答
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

我认为处理它的最简单方法是添加逻辑,以便在与桨碰撞后,球的速度矢量被迫始终指向远离桨的中心点。这样,即使球“再次”与桨“碰撞”(因为它在事件循环的下一个滴答声中向内走得太远而无法再次离开),它也会在第二次“反弹”后继续远离桨.

于 2009-10-14T03:10:41.780 回答