swift sprite-kit touch skspritenode touchesbegan

swift - ¿Cómo detecto si se ha tocado un SKSpriteNode?



sprite-kit touch (10)

Estoy tratando de detectar si mi nodo sprite ha sido tocado y no tengo 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)


Actualización para Swift 3.0 y XCode 7.3.1. Tengo un SKShapeNode que he derivado a una nueva clase y lo inserté en la escena. Cuando quiero detectar este objeto, verifico lo siguiente:

override func touchesBegan(touches: Set<UITouch>, 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 } } } }


Actualización para Swift Swift versión 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1) y XCode Versión 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<UITouch>, 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") } } }


Esta es la forma en que uso en Swift 4 para encontrar si hay un toque en un tipo específico de nodo:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } let touchPosition = touch.location(in: self) let touchedNodes = nodes(at: touchPosition) for node in touchedNodes { if let nodoTouched = node as? YourNodeType { // touched! } } }


Esto detectará toques en Xcode 9.2 Swift 4.0

override func touchesBegan(_ touches: Set<UITouch>, 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") } } }


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

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


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

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

luego en touchesBegan , touchesBegan función 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 subclasificar 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)


Respuesta rápida 3 que incorpora la 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<UITouch>, with event: UIEvent?) { print("touch!") } }


Si aún no ha logrado que su sprite funcione, incluso después de subclasificar SKSpriteNode , ¡probablemente olvidó agregar node.isUserInteractionEnabled = true cuando lo inicializa!

Esto permite touchesBegan(_:with:) , ya que ahora puede interactuar con el nodo.

Ejemplo:

node = MySprite(texture: texture, size: size) node.isUserInteractionEnabled = true


Si está buscando solo unos pocos nodos que se pueden tocar (por ejemplo, las etiquetas "Continuar" o "Salir" en una interfaz de usuario del juego), esta podría ser una solución alternativa pero muy simple:

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


Use este código para detectar el toque en SKSpriteNode

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