这是为我的旋转节点制作 if 语句的正确方法吗?

Is this the correct way to make an if statement for my rotating node?

我可以用一根手指旋转我的节点,但我的 if 语句有问题。如果我向左或向右旋转,我有一个 if 语句来添加一个动作。当我向右旋转时,我打印到控制台 print("rotate right"),当我向左旋转时,我打印到控制台 print("rotate left")。我遇到的问题是,当我向右旋转时,有一个旋转点打印出 "rotate left",而在同一点上,当我向左旋转时,同样的事情发生了,它打印出 "rotate right"。为什么会这样?

编辑这里是现场的照片。

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
            }
        }
    }
}

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)