Marcus Toepper - 1 year ago 79
Swift Question

# Moving a SKSpriteNode in a downward loop, using Swift

Using Swift and SpriteKit, I'd like to move a SKSpritenode in a spiral pattern, but didn't find the right resources to get me started. To be more precise, I'd like to move a sprite node in a downward loop. I've checked a sequence of SKActions, but as they are not executed parallel, a circular movement combined with move-to will not work. I'd be glad for any hints, tutorials or snippets to set me on the right track.

Marcus

I've put together some sample code which you can adapt for your purposes. I've based the code off the equation for an Archimedean Spiral:

``````r = a + bθ
``````

Where `a` is the starting radius; `b` is the radius the spiral will increase by per revolution and `θ` is the current angle.

A spiral is basically a glorified circle (IMO), so to move your node in a spiral you need to be able to calculate point on a circle using an angle, radius and center point:

``````func pointOnCircle(#angle: CGFloat, #radius: CGFloat, #center: CGPoint) -> CGPoint {
return CGPoint(x: center.x + radius * cos(angle),
y: center.y + radius * sin(angle))
}
``````

Next, extend `SKAction` so you can easily create a spiral action:

``````extension SKAction {
totalAngle: CGFloat, centerPoint: CGPoint, duration: NSTimeInterval) -> SKAction {

// The distance the node will travel away from/towards the
// center point, per revolution.

let action = SKAction.customActionWithDuration(duration) { node, time in
// The current angle the node is at.
let θ = totalAngle * time / CGFloat(duration)

// The equation, r = a + bθ

}

return action
}
}
``````

Finally, an example of use. In `didMoveToView`:

``````let node = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: 10, height: 10))
node.position = CGPoint(x: size.width / 2, y: size.height / 2)