我能够用一根手指旋转节点,但我的if
语句出现问题。如果我向左或向右旋转,我会添加if
语句来添加操作。当我向右旋转时,我向控制台print("rotate right")
打印,当我向左旋转时,我print("rotate left")
。我遇到的问题是当我向右旋转时,我旋转的位置打印了#34;向左旋转"在同一个地方,当我向左旋转时,同样的事情会发生,并且#34;向右旋转"。为什么会这样?
编辑这里是一张现场照片。
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
for touch in touches {
var previousAngle: CGFloat = 0.0
let location = touch.locationInNode(self)
let node = self.nodeAtPoint(location)
if node.name == "circle" {
if lastNodeSelected != nil {
let touchedNode = lastNodeSelected!
//lets user rotate with one finger.
let dy = touchedNode.position.y - location.y
let dx = touchedNode.position.x - location.x
let angle2 = atan2(dy, dx)
touchedNode.zRotation = angle2
let delta = (angle2 - previousAngle)
if delta > 0 {
print("rotate left")
}
else {
print("rotate right")
}
previousAngle = angle2
}
}
}
}
答案 0 :(得分:3)
atan2
给出从-π到π的结果,所以有一个转换点,其中值跳跃2π(或-2π,取决于你要去的方向)。
为了使这项工作在一般情况下,你不能只是减去角度;您需要确定angle2
是否更接近previousAngle
顺时针或逆时针移动。
尝试:
func rotationDelta(fromAngle a0: Double, toAngle a1: Double) -> Double {
let π = M_PI
return ((a1 - a0) % (2*π) + 3*π) % (2*π) - π
}
......然后:
let delta = rotationDelta(fromAngle: previousAngle, toAngle: angle2)