Перетащите Повернуть узел вокруг фиксированной точки

Я пытаюсь создать вращающийся узел, похожий на «призовое колесо» вэтот вопрос, Пока у меня есть возможность бросать, добавляя угловые импульсы к физическому телу, используя UIPanGestureRecognizer, который работает очень хорошо. Я также могу остановить вращение, используя прикосновение.

Теперь я пытаюсь разрешить точную настройку колеса с помощью жеста перетаскивания или смахивания, чтобы, если игрок не доволен тем, что у него получилось, он может вручную вращать / перетаскивать / вращать его в предпочтительное вращение.

В настоящее время я сохраняю местоположение касания в touchesBegan и пытаюсь увеличить zRotation моего узла в цикле обновления.

Вращение не следует за моим пальцем и прерывисто. Я не уверен, получаю ли я достаточно точные показания о движении пальца или если положение изменения пальца не переводится точно в радианы. Я подозреваю, что обнаружение касания, а затем работа с ним в обновлении не является хорошим решением.

Вот мой код

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent?) {
    if let touch = touches.first as? UITouch {
        var location = touch.locationInView(self.view)
        location = self.convertPointFromView(location)

        mostRecentTouchLocation = location

        let node = nodeAtPoint(location)
        if node.name == Optional("left") && node.physicsBody?.angularVelocity != 0
        {
            node.physicsBody = SKPhysicsBody(circleOfRadius:150)
            node.physicsBody?.applyAngularImpulse(0)
            node.physicsBody?.pinned = true
        }
    }
}

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
        if mostRecentTouchLocation != CGPointZero{
        let node = nodeAtPoint(mostRecentTouchLocation)
        if node.name == Optional("left")
        {
            var positionInScene:CGPoint = mostRecentTouchLocation
            let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
            let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
            let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
            let maths:CGFloat = angle - (CGFloat(90) * (CGFloat(M_PI) / 180.0))
            node.zRotation += maths
            mostRecentTouchLocation = CGPointZero
        }
    }
}

В этом обновлении я распределил некоторые математические функции по нескольким строкам, чтобы облегчить отладку.

Я могу добавить код PanGestureRecognizer, если это необходимо, но сейчас я постараюсь сделать его кратким.

РЕДАКТИРОВАТЬ Вот мой последний код, основанный на рекомендации GilderMan. Я думаю, что это работает лучше, но вращение далеко не гладкое. Он прыгает большими шагами и плохо следит за пальцем. Значит ли это что-то не так с моим расчетом угла?

    override func didSimulatePhysics() {
    if mostRecentTouchLocation != CGPointZero {
        let node = nodeAtPoint(mostRecentTouchLocation)
        if node.name == Optional("left")
        {
            var positionInScene:CGPoint = mostRecentTouchLocation
            let deltaX:Float = Float(positionInScene.x) - Float(node.position.x)
            let deltaY:Float = Float(positionInScene.y) - Float(node.position.y)
            let angle:CGFloat = CGFloat(atan2f(deltaY, deltaX))
            node.zRotation += angle
            println(angle)
            mostRecentTouchLocation = CGPointZero
        }
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос