¿Cómo puedo detectar si un SKSpriteNode ha sido tocado?

Estoy tratando de detectar si mi nodo sprite ha sido tocado y no tengo ni idea de por dónde empezar.

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

Primero establezca la propiedad del name del SKSpriteNode en una cadena.

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

luego en la función touchesBegan en la 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") } } } 

Esta es una manera de hacerlo.
También puede subclase SKSpriteNode y anular los touchesBegan dentro de él.

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

Entonces hazlo

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

Si solo busca algunos nodos que se pueden tocar (por ejemplo, las tags “Continuar” o “Salir” en la interfaz de usuario de un juego), esta podría ser una solución alternativa pero muy simple:

 override func touchesBegan(touches: Set, withEvent event: UIEvent?) { let touch = touches.first! if myNode.containsPoint(touch.locationInNode(self)) { print("touched") } } 

Actualización para Swift Swift versión 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1) y XCode Version 8.2.1 (8C1002):

El valor del tipo ‘Set’ no tiene miembro ‘ anyObject

locationInNode ‘ ha cambiado de nombre a ‘location (in :)’

nodeAtPoint ‘ ha cambiado de nombre a ‘atPoint (_ :)’

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { for touch in touches { let location = touch.location(in: self) let node : SKNode = self.atPoint(location) if node.name == "myNodeName" { print("Hello") } } } 

Esto detectará toques en Xcode 9.2 Swift 4.0

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { let touch:UITouch = touches.first! let positionInScene = touch.location(in: self) let touchedNode = self.atPoint(positionInScene) if let name = touchedNode.name { if name == "playLbl" { print("playLbl Touched") } } } 

Swift 3 respuesta que incrusta funcionalidad táctil en la subclase de SKSpriteNode :

 class SpriteSub: SKSpriteNode { init() { super.init(texture: nil, color: UIColor.red, size: CGSize(width: 50, height: 50)) isUserInteractionEnabled = true } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } ... override func touchesBegan(_ touches: Set, with event: UIEvent?) { print("touch!") } } 

Implemente el método touchesBegan que se touchesBegan cuando comienza un toque. Alternativamente, puedes hacer esto en touchesEnded También.

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { let touch = touches.anyObject() as UITouch let location = touch.locationInNode(self) let nodes = self.nodesAtPoint(location) for node in nodes { if node.name == "youNodeName" { // Node tapped // Do something break } } } 

Utilice este fragmento de código para detectar el toque en SKSpriteNode

 if(nodeAtPoint(location) == node){ } 

Actualización para Swift 3.0 y XCode 7.3.1. Tengo un SKShapeNode que derivé a una nueva clase y lo inserté en la escena. Cuando quiero detectar este objeto lo compruebo de la siguiente manera:

 override func touchesBegan(touches: Set, withEvent event: UIEvent?) { for touch in touches { let location = touch.locationInNode(self) let nodes = self.nodesAtPoint(location) for node in nodes { if node is SKNodeDerivedNode { NSLog("Touch a SKNodeDerivedNode") break } } } } 
    Intereting Posts