swiftsprite-kittouchskspritenodetouchesbegan

How do I detect if an SKSpriteNode has been touched


I am trying to detect if my sprite node has been touched and I have no idea where to start.

let Pineapple = SKSpriteNode(imageNamed: "Pineappleimg")
Pineapple.userInteractionEnabled = true
Pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
self.addChild(Pineapple)

Solution

  • First set the name property of the SKSpriteNode to a string.

    pineapple.name = "pineapple"
    pineapple.userInteractionEnabled = false
    

    then in touchesBegan function in the Scene

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        let touch:UITouch = touches.anyObject()! as UITouch
        let positionInScene = touch.locationInNode(self)
        let touchedNode = self.nodeAtPoint(positionInScene)
    
        if let name = touchedNode.name
        {
            if name == "pineapple"
            {
                print("Touched")
            }
        }
    
    }
    

    This is one way to do it.
    You can also subclass SKSpriteNode and override the touchesBegan inside it.

    class TouchableSpriteNode : SKSpriteNode
    {
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
            print("touched")
        }
    }
    

    Then do

    let pineapple = TouchableSpriteNode(imageNamed: "Pineappleimg")
    pineapple.userInteractionEnabled = true
    pineapple.position = CGPoint(x: CGRectGetMidX(self.frame) - 200, y: CGRectGetMidY(self.frame));
    self.addChild(pineapple)