HowTo: Implement targeting or follow behaviour with SpriteKit and SKConstraint in SWIFT

Welcome to Part 14 of my blog series about iOS game development: SpriteKit and SKConstraint

At the developer conference WWDC, in June this year, Apple showed a new class in SpriteKit: SKConstraint. It can be used to define constraints for the orientation, the distance or the position of SpriteKit nodes. In my todays blog post I’ll show how to use SKContraints to implement a follow and targeting behavior. I have updated this tutorial to XCode 6.3 and SWIFT 1.2!

1. Create a new Project



2. Open the GameScene.swift file and remove the code for creating a label in didMoveToView:

    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

3. Create a global Sprite property:

    var sprite = SKSpriteNode()
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */

4. Create two sprites inside didMoveToView:

       self.backgroundColor = UIColor.blackColor()
        // Create the followed sprite
        sprite = SKSpriteNode(imageNamed:„Spaceship“)
        sprite.xScale = 0.15
        sprite.yScale = 0.15
        sprite.position = CGPointMake(100, 100)
        // Create the follower sprite
        let followerSprite = SKSpriteNode(imageNamed:„Spaceship“)
        followerSprite.xScale = 0.15
        followerSprite.yScale = 0.15
        followerSprite.position = CGPointMake(150, 150)
        followerSprite.color = UIColor.redColor()

5. Create two constraints inside didMoveToView

One to specify the distance between the two Sprites to implement the follow behavior:

        // Define Constraints for following behavior
        let rangeToSprite = SKRange(lowerLimit: 100.0, upperLimit: 150.0)
        let distanceConstraint = SKConstraint.distance(rangeToSprite, toNode: sprite)

One to specify the orientation of the follower Sprite to the followed Sprite: 

        // Define Constraints for orientation/targeting behavior

       let rangeForOrientation = SKRange(lowerLimit: CGFloat(M_2_PI*7), upperLimit: CGFloat(M_2_PI*7))

       let orientConstraint = SKConstraint.orientToNode(sprite, offset: rangeForOrientation)

Add the constraints to the follower Sprite:

        // Add constraints
        followerSprite.constraints = [orientConstraint, distanceConstraint]

6. Replace the code inside the touchesBegan method to implement the sprite movement:

    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        /* Called when a touch begins */
        for touch in (touches as! Set<UITouch>) {
            let location = touch.locationInNode(self)
            let action = SKAction.moveTo(location, duration: 1)

7. Start the project:



The source code can be found in my GitHub repository.
That’s all for today.
Quick Tip: Endless scrolling with SpriteKit and SWIFT (Part 1 of 2)
AdSense and Admob
Quick Tip: Implement the new Google AdMob / AdSense Cookie Policy
Implement an Augmented Reality game like Pokemon Go (Part 1)