web-dev-qa-db-fra.com

Comment détecter si un SKSpriteNode a été touché

J'essaie de détecter si mon noeud Sprite a été touché et je ne sais pas par où commencer.

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

Définissez d'abord la propriété name de la SKSpriteNode sur une chaîne.

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

puis dans la fonction touchesBegan dans 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")
        }
    }

}

C'est une façon de le faire.
Vous pouvez également sous-classe SKSpriteNode et remplacer la touchesBegan à l'intérieur.

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

Alors fais 

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

Si vous ne recherchez que quelques nœuds pouvant être touchés (par exemple, les étiquettes "Continuer" ou "Quitter" dans une interface de jeu), cette solution peut être simple mais très simple:

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

Mise à jour pour Swift Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1) et XCode version 8.2.1 (8C1002):

La valeur du type 'Set' n'a pas de membre ' anyObject '

' locationInNode ' a été renommé 'emplacement (en :)'

' nodeAtPoint ' a été renommé '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")
        }
    }
}
10
Alexandr Lihonosov

Cela détectera les contacts dans 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")
        }
    }

}
7
uplearnedu.com

Swift 3 answer qui intègre la fonctionnalité tactile dans la sous-classe 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!")
    }

}
6
Crashalot

Implémentez la méthode touchesBegan qui est appelée au début d'un contact. Vous pouvez également le faire dans touchesEnded également.

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

Utilisez ce morceau de code pour détecter le contact sur SKSpriteNode 

if(nodeAtPoint(location) == node){



}
4
zbz.lvlv

Mise à jour pour Swift 3.0 et XCode 7.3.1. J'ai un SKShapeNode que j'ai dérivé dans une nouvelle classe et que je l'ai inséré dans la scène. Quand je veux détecter cet objet, je vérifie comme suit:

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
            }
        }
    }
}
1
Richard Bown

Voici comment j'utilise dans Swift 4 pour rechercher une touche dans un type de nœud spécifique:

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!
        }
    }
}
0
abanet