ios rotation sprite-kit

ios - La rotación del nodo no sigue un dedo



rotation sprite-kit (1)

Intento rotar una flecha para seguir un movimiento de dedo pero funciona de forma extraña. Definitivamente no lo está siguiendo. Estoy tratando de hacerlo en touchesMoved. Traté de hacer esto:

var fingerLocation = CGPoint() override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { for touch: AnyObject in touches { fingerLocation = touch.locationInNode(self) let currentOrient = arrow.position let angle = atan2(currentOrient.y - fingerLocation.y, currentOrient.x - fingerLocation.y) let rotateAction = SKAction.rotateToAngle(angle + CGFloat(M_PI*0.5), duration: 0.0) arrow.runAction(rotateAction) } }

Y también probé esto:

var fingerLocation = CGPoint() override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) { for touch: AnyObject in touches { fingerLocation = touch.locationInNode(self) } override func update(currentTime: CFTimeInterval) { /* Called before each frame is rendered */ var radians = atan2(fingerLocation.x, fingerLocation.y) arrow.zRotation = -radians }

También probé SKConstraint.orientToPoint pero tampoco tuve suerte. ¿Qué estoy haciendo mal? Cada respuesta a una pregunta similar es sugerencia atan2, pero no parece funcionar para mí.


Si quieres rotar el objeto hacia la ubicación táctil, debería ser simple como:

let touchLocation = touch.locationInNode(self) var dx = hero.position.x - positionInScene.x; var dy = hero.position.y - positionInScene.y ; var angle = atan2(dy,dx) + CGFloat(M_PI_2) hero.zRotation = angle

Funcionó cuando lo intenté, por lo que puede darte una idea básica de por dónde empezar. O entendí mal lo que estás tratando de lograr ...

EDITAR:

Actualmente, lo que obtendrás si tratas de convertir el ángulo a grados es un ángulo en el rango de -90 a 270 grados. Se describe aquí por qué. Si desea trabajar con un ángulo en el rango de 0 a 360, puede cambiar el código anterior a:

var dx = missile.position.x - positionInScene.x ; var dy = missile.position.y - positionInScene.y; var angleInRadians = atan2(dy,dx) + CGFloat(M_PI_2) if(angleInRadians < 0){ angleInRadians = angleInRadians + 2 * CGFloat(M_PI) } missile.zRotation = angleInRadians var degrees = angleInRadians < 0 ? angleInRadians * 57.29577951 + 360 : angleInRadians * 57.29577951

Aquí está el resultado con los datos de depuración: