我有一个问题,如果球刚刚击中球拍,它会被锁在内部并且无法释放。它有时发生在玩家桨上,但由于你可以控制它,所以你需要做的就是移动它并且它会逃脱。计算机完美地跟随球,所以一旦它进入它就永远无法逃脱,导致happens in this video。现在这只发生在我增加帧速率时,如果它真的很低,它有点,错误输出并且“穿过”桨,导致获得一个点。至少在这种情况下,它不是一个明显的错误,游戏继续发挥。
当然,我希望帧速率尽可能平滑......所以要对它进行排序。这是我非常简单的碰撞检测的代码。使用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
}
}
感谢您的帮助。
答案 0 :(得分:4)
没有看到你的其余代码,这只是一个猜测,但可能发生的是球的速度不断地来回翻转。你需要在击球后将球移到球拍外面,或者“碰撞之间的最短时间”
答案 1 :(得分: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
}
答案 2 :(得分: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;
}
}
答案 3 :(得分:0)
我认为处理它的最简单方法是添加逻辑,以便在与桨碰撞后,球的速度矢量总是指向远离桨的中心点。这样,即使球“与球拍再次碰撞”(因为它在内部太远以至于在事件循环的下一个嘀嗒声中再次离开),它将在第二次“反弹”之后继续远离桨。
答案 4 :(得分:0)
这个问题类似于我在球拍内被抓住的问题。我解决这个问题的方法是创建一个布尔值。发生冲突时,布尔值设置为true。当球击中墙壁时,布尔值设置为false。在我们检查Rectangle Intersection的条件语句中,我添加一个检查以查看collision是否设置为false。
所以,最终会发生什么:
试试这个,让我知道它是如何运作的。
布兰登