这是为旋转节点创建if语句的正确方法吗?

时间:2016-05-07 03:22:23

标签: ios swift touchesmoved

我能够用一根手指旋转节点,但我的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
            }
        }
    }
}

1 个答案:

答案 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)