David Chalco
David Chalco

Reputation: 47

Rotating SKNode to point at touch contact point

Context: I'm using Xcode, Swift, and SpriteKit

I've created a separate class file "Ship.swift" and within it I've got:

let RAD_PER_SEC: CGFloat = 0.1
var direction = 0

//Updates object value for determining how much to rotate object
func spin {

}

Ideally I want to make an app sort of like the old game Astroids. For now, I just a ship that rotates in the center of the screen and points towards the touch-contact point.

Upvotes: 0

Views: 1111

Answers (2)

ABakerSmith
ABakerSmith

Reputation: 22939

As of iOS8 Apple added SKConstraints which can be added to SKNodes. Here's the documentation: https://developer.apple.com/library/mac/documentation/SpriteKit/Reference/SKConstraint_Ref/index.html#//apple_ref/occ/cl/SKConstraint

In your case you'll want to create the constraint when the user touches the screen - SKConstraint.orientToPoint(touchLocation, offset: SKRange.rangeWithConstantValue(0))

And the add it to your sprite node using the constraints property.

Upvotes: 1

Whirlwind
Whirlwind

Reputation: 13665

If you want to rotate node towards the touch location you need to know the angle to rotate to. Because in Spritekit angles are measured in radians there are some conversions that have to be done:

let Pi = CGFloat(M_PI)
let DegreesToRadians = Pi / 180

After that you have to use atan2() to calculate the angle...Here is simple example which rotates sprite using touchesMoved method:

override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        let curTouch = touches.anyObject() as UITouch
        let curPoint = curTouch.locationInNode(self)

        let deltaX = self.yourNode.position.x - curPoint.x
        let deltaY = self.yourNode.position.y - curPoint.y
        let angle = atan2(deltaY, deltaX)

        self.yourNode.zRotation = angle + 90 * DegreesToRadians

    }

Upvotes: 2

Related Questions