2016-07-29 34 views
1

Ich arbeite mit Swift und SpriteKit.Wie erkennt man genau, wenn ein SKShapeNode berührt wird?

Ich habe folgende Situation:

enter image description here

Hier ist jeder der "Dreiecke" ist ein SKShapenode. Mein Problem ist, dass ich erkennen möchte, wenn jemand den Bildschirm berührt, welches Dreieck berührt wird. Ich nehme an, dass die Hitbox aller dieser Dreiecke Rechtecke sind, so dass meine Funktion mir alle berührten Hitboxen zurückgibt, während ich nur wissen will, welche tatsächlich berührt wird.

Gibt es eine Möglichkeit, eine Hitbox zu erhalten, die genau der Form entspricht, anstatt einem Rechteck?

Hier ist mein aktueller Code:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touch = touches.first 
    let touchPosition = touch!.locationInNode(self) 
    let touchedNodes = self.nodesAtPoint(touchPosition) 

    print(touchedNodes) //this should return only one "triangle" named node 

    for touchedNode in touchedNodes 
    { 
     if let name = touchedNode.name 
     { 
      if name == "triangle" 
      { 
       let triangle = touchedNode as! SKShapeNode 
       // stuff here 
      } 
     } 
    } 
} 

Antwort

1

Sie könnten versuchen, CGPathContainsPoint zu verwenden, um mit einem SKShapeNode statt nodesAtPoint, die besser geeignet ist:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    let touch = touches.first 
    let touchPosition = touch!.locationInNode(self) 
    self.enumerateChildNodesWithName("triangle") { node, _ in 
     // do something with node 
     if node is SKShapeNode { 
      if let p = (node as! SKShapeNode).path { 
       if CGPathContainsPoint(p, nil, touchPosition, false) { 
        print("you have touched triangle: \(node.name)") 
        let triangle = node as! SKShapeNode 
        // stuff here 
       } 
      } 
     } 
    } 
} 
+0

Es ist genau das, was ich wollte! Und alle Knoten, die "Dreieck" genannt werden, sind SKShapeNodes, könnten wir nach 'enumerateChildNodesWithName' hinzufügen, lassen Sie shapenode = node as! SKShapeNode', und entferne 'if node is SKShapeNode' und' if p = (node ​​as! SKShapeNode) .path' nur, wenn 'if CGPathContainsPoint (shapenode.path, nil, touchPosition, false)' '? – Drakalex

+0

Es ist nicht sicher, enumerateChildNodesWithName arbeitet mit generischen SKNode;), werfen Sie einen Blick auf den Apple-Leitfaden: https://developer.apple.com/reference/spritekit/sknode/1483024-enumeratechildnodeswithname –

0

Dies ist der einfachste Weg wäre, es zu tun .

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
{ 
    for touch in touches { 
     let location = touch.locationInNode(self) 
     if theSpriteNode.containsPoint(location) { 
      //Do Whatever  
     } 
    } 
} 
+0

Wie geht das durch die Dreiecke zu finden Welcher ist berührt? – Confused