目前,我正在Swift中制作一个乒乓球游戏(没有SpriteKit),它是一个参与者:球可以从视图的所有侧面弹起。经过一番研究,我使用了这种算法来检测碰撞:
if (rect1.x < rect2.x + rect2.width &&
rect1.x + rect1.width > rect2.x &&
rect1.y < rect2.y + rect2.height &&
rect1.y + rect1.height > rect2.y) {
// collision detected!
}
这很好用,但是我如何检测到球击中了桨的哪一侧呢?
我需要知道这一点,因为:如果球击中了桨的底部或顶部,我会将y增量乘以-1。如果球碰到了桨的左侧或右侧,我会将x的增量乘以-1。
答案 0 :(得分:0)
如果rect1和rect2均为CGRect,则可以通过...获得中点。
rect1.midY
和
rect2.midY
然后您可以确定中点球(无论是哪个球)是高于还是低于桨叶的中点。
if rect1.midY >= rect2.midY
等等...
请注意,使用SpriteKit会更好。但是,如果您只是为了娱乐而做,那就继续吧。希望能解决。 :-)
答案 1 :(得分:0)
我找到了一个不错的(但不是很好)的解决方案。如果球触碰球拍的左侧或右侧,则此函数返回true
;如果球触碰球拍的顶部或底部,则此函数返回false
。
func touchHorizontalPaddle() -> Bool {
if abs(ball.origin.x + ball.width - paddle.origin.x) < 1 ||
abs(ball.origin.x - (paddle.origin.x + paddle.width)) < 1 {
return true
}
return false
}
此功能的主要问题是“少于1”部分是硬编码的。因此,如果球速度太快或增量太大,则条件语句可能变得混乱。总体而言,它运行良好。