Drag Einen Knoten um einen festen Punkt drehen

Ich versuche, einen drehbaren Knoten zu erstellen, der dem "Preisrad" in @ ähneldiese Frag. Bisher habe ich die Fähigkeit zu schleudern, mit einem UIPanGestureRecognizer Winkelimpulse auf einen physischen Körper zu übertragen, was sehr gut funktioniert. Ich kann das Drehen auch mit einer Berührung stoppen.

Jetzt versuche ich, eine Feineinstellung des Rads durch Ziehen oder Wischen zu ermöglichen. Wenn der Spieler mit dem Ergebnis nicht zufrieden ist, kann er es manuell drehen, ziehen oder in die gewünschte Richtung drehen.

Gegenwärtig speichere ich den Ort der Berührung in touchesBegan und versuche, die zRotation meines Knotens in der Aktualisierungsschleife zu erhöhen.

Die Drehung folgt nicht meinem Finger und ruckelt. Ich bin nicht sicher, ob die Fingerbewegung genau genug angezeigt wird oder ob die Position des Fingers nicht genau in Bogenmaß umgerechnet wird. Ich vermute, dass es keine gute Lösung ist, die Berührung zu erkennen und dann im Update damit umzugehen.

Hier ist mein Code.

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

Ich habe einige Berechnungen im Update auf mehrere Zeilen verteilt, um das Debuggen ein wenig zu vereinfachen.

Ich kann den PanGestureRecognizer-Code bei Bedarf hinzufügen, aber ich werde versuchen, ihn vorerst kurz zu halten.

BEARBEITE Hier ist mein neuester Code, der auf der Empfehlung von GilderMan basiert. Ich denke, es funktioniert besser, aber die Rotation ist alles andere als reibungslos. Es springt in großen Schritten und folgt dem Finger nicht gut. Bedeutet das, dass mit meiner Winkelberechnung etwas nicht stimmt?

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage