I am trying to create a spableable node similar to the "drive" in this question . So far I have the opportunity by adding angular pulses in the physical body using the UIPanGestureRecognizer, which works very well. I can also stop the rotation by touch.
Now Iβm trying to enable fine tuning of the wheel with drag and swipe gestures, so if a player is not happy with what heβs doing, they can manually rotate / drag / rotate it to their favorite rotation.
I am currently saving the touch location in touchhesBegan and trying to increase the zRotation of my node in the update loop.
The rotation does not follow my finger and twitches. I'm not sure if I get enough accurate data about the movement of the finger or if the position of the finger changes will not be accurately converted to radians. I suspect that I discovered a touch, and then contacting him in an update is not a great solution.
Here is my 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) { 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 } } }
I have distributed some math data across multiple lines in the update to facilitate debugging.
I can add the PanGestureRecognizer code if necessary, but I will try to make it short for now.
EDIT Here is my latest code based on the GilderMan recommendation. I think it works better, but the rotation is far from smooth. He jumps in large increments and does not follow his finger well. Does this mean that something is wrong with my angle calculation?
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 } } }
swift sprite-kit
Throwing spoon
source share