Search code examples
sprite-kittouchesbegantouchesmoved

Moving multiple nodes at once from touch with SpriteKit


I have a game that has 3 SKSpriteNodes that the user can move around using the touchesBegan and touchesMoved. However, when the users moves nodeA and passes another node called nodeB, nodeB follows nodeA and so on.

I created an array of SKSpriteNodes and used a for-loop to make life easier.

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {


        let nodes = [nodeA, nodeB, nodeC]

        for touch in touches {

            let location = touch.location(in: self)

            for node in nodes {

                if node!.contains(location) {

                    node!.position = location
                }

            }


        }

    }

Everything is working except when nodeA is moving and cross paths with nodeB, nodeB follows nodeA.

How can I make it so that when the user is moving nodeA and nodeA passes through nodeB that nodeB would not follow nodeA.


Solution

  • Instead of doing slow searches, have a special node variable for your touched node

    class GameScene
    {
        var touchedNodeHolder : SKNode?
    
        override func touchesBegan(.....)
        {
            for touch in touches {
                guard touchNodeHandler != nil else {return} //let's not allow other touches to interfere
                let pointOfTouch = touch.location(in: self)
                touchedNodeHolder = nodeAtPoint(pointOfTouch)
            }
        }
        override func touchesMoved(.....)
        {
            for touch in touches {
    
                let pointOfTouch = touch.location(in: self)
                touchedNodeHolder?.position = pointOfTouch
            }
        }
        override func touchesEnded(.....)
        {
            for touch in touches {
    
                touchedNodeHolder = nil
            }
        }
    }