我有一个if语句检查我正在移动的对象的速度(图像)。声明的目的是阻止图像受影响的方式,一旦它这样做,它就会锁定X或Y平面,这样就可以平稳地左右移动,或者平滑的上下移动。
由于代码在下方(首先检查右移动,然后是左移,等等),如果你向左或向右移动,移动会更顺畅。然而,有时候,当试图向上或向下影响运动时,它会被锁定在左右运动中。我相信这是因为它首先在if语句中查看左右移动。如果我先上下移动以进行检查,则左右移动会变得不稳定。有更好的方法吗?
let velocity = recognizer.velocity(in: self.view)
if velocity.x > 75 {
movingRight = true
myBlocks[objectDragging].center.y = CGFloat(initPosy)
} else if velocity.x < -75 {
movingLeft = true
myBlocks[objectDragging].center.y = CGFloat(initPosy)
} else if velocity.y < -30 {
movingUp = true
myBlocks[objectDragging].center.x = CGFloat(initPosx)
} else {
movingDown = true
myBlocks[objectDragging].center.x = CGFloat(initPosx)
}
答案 0 :(得分:2)
此问题的示例是当您向上移动并略微向右移动时,如下所示:x = 78, y = -450
这绝对是垂直移动的一个示例,但是为了让您的算法知道它,您需要比较velocity.x
和velocity.y
值。
更好的方法是检查哪个轴具有最高的速度绝对值。在你的情况下,它也需要缩放(水平移动的阈值是75,垂直移动的阈值是30)。
if abs(velocity.x) > abs(velocity.y * 2.5) {
// this is horizontal movement
}
else {
// this is vertical movement
}
答案 1 :(得分:1)
也许您应该首先检查哪个方向具有更大的幅度,然后确定其是正还是负。
let velocity = recognizer.velocity(in: self.view)
if abs(velocity.x) > abs(velocity.y) {
//going left/right
if velocity.x > 0 {
movingRight = true
myBlocks[objectDragging].center.y = CGFloat(initPosy)
} else {
movingLeft = true
myBlocks[objectDragging].center.y = CGFloat(initPosy)
}
} else {
if velocity.y > 0 {
movingUp = true
myBlocks[objectDragging].center.x = CGFloat(initPosx)
} else {
movingDown = true
myBlocks[objectDragging].center.x = CGFloat(initPosx)
}
}
正如@johnyu建议的那样 - 您可以使用一个因子来比较水平运动与垂直运动。