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: