Moving multiple nodes at once from touch with Spri

2019-03-06 02:28发布

问题:

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.

回答1:

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
        }
    }
}


回答2:

After some experimenting, I found a way to go about this problem.

Instead of selecting the node by the position of the touch, I found that selecting the node by its name property did the trick.

The code shown is implemented inside the touchesMoved and touchesBegan methods

//name of the nodes
    let nodeNames = ["playO", "playOO", "playOOO", "playX", "playXX", "playXXX"]
//the actual nodes
    let player = [playerO, playerOO, playerOOO, playerX, playerXX, playerXXX]

        for touch in touches {

            let pointOfTouch = touch.location(in: self)
            let tappedNode = atPoint(pointOfTouch)
            let nameOfTappedNode = tappedNode.name

            for i in 0..<nodeNames.count {

                if nameOfTappedNode == nodeNames[i] {
                    z += 1
                    player[i]!.zPosition = CGFloat(z)
                    print(player[i]!.zPosition)
                    player[i]!.position = pointOfTouch
                }
            }

        }