Ardemis
Ardemis

Reputation: 149

Updating multiple Spritekit nodes with the same name

I am currently making a game with Spritekit & Swift3 for the first time; it is a 2D, side-scrolling endless runner. I'm trying to have certain nodes move with my camera, but the problem is that they will be procedurally generated, belonging to the same class, so I need them all to have the same name. Here's the relevant sections of code, before I go any further:

(All variables have been initialized)

//move these nodes with the camera

private var ChoosePieces: ChoosePiecesClass?;

override func didMove(to view: SKView) {
        initializeGame();
}

override func update(_ currentTime: TimeInterval) {
    enumerateChildNodes(withName: "ChoosePieces") {
        node, stop in
        _ = node as! SKSpriteNode

        self.ChoosePieces?.moveWithCamera();

    }
}

private func initializeGame() {
    ChoosePieces = childNode(withName: "ChoosePieces") as? ChoosePiecesClass;
}

I have tested the moveWithCamera() function and it works well--it simply increments the node's x-value by 10, moving at the same pace as the camera so that the node remains on screen at the same location.

My problem is that I'm not exactly sure how to use enumerateChildNodes(withName: "String") with my nodes, so that it will recognize all of them and move them. Right now the pieces just stay still. I found out about this function from another person's post--he/she was trying to spawn "enemies" in his/her game. Thanks in advance!

Upvotes: 3

Views: 415

Answers (1)

Steve Ives
Steve Ives

Reputation: 8134

Usually with enumerateChildNodes you do something with the node that is returned e.g. modifying your own example:

override func update(_ currentTime: TimeInterval) {
    enumerateChildNodes(withName: "ChoosePieces") {
        node, stop in
        if let piece = node as? SKSpriteNode { // Cast to Sprite if we can
            piece.moveWithCamera()
        }
    }
}

So for every node that is returned, we cast it to a new SKSpriteNode called 'piece (if we can - using the as? operator - because enumerateChildNodes returns SKNodes) ' and then call moveWithCamera on the 'piece' node.

(the line piece.moveWithCamera() I made up - your original code appeared to be calling a class method(?) to do something. You might want self.moveWithCamera(piece) etc)

In your code, you did nothing with the nodes returned by your enumeration.

Upvotes: 4

Related Questions