2016-07-10 19 views
0

Ich habe eine SKSpriteNode. Diese SKSpriteNode hat mehrere Kinder. Wie kann ich erkennen, ob es berührt wurde? Nun, lassen Sie mich klar sein, ich weiß bereits, eine Schaltfläche in SpriteKit einzurichten, und ich habe versucht, den gleichen Code zu verwenden, den ich verwendet habe, um festzustellen, ob der Hauptelternknoten berührt wurde, aber es hat nicht funktioniert. Der Knopf tut nichts. Gibt es eine Möglichkeit, das zu beheben? Außerdem habe ich bereits versucht, die Benutzerinteraktion für die Kindknoten auf Wahr zu setzen.So erkennen Sie, ob der Kindknoten berührt wurde: Sprite Kit

Antwort

2

Hier ist eine Möglichkeit, kontinuierliche Berührungen (d. H. Richtungspfeile) zu verfolgen.

Sie benötigen eine Übersicht über die Berührungen zu halten, in dem SKScene Knoten oder in der übergeordneten Ansicht Controller:

var touches = Set<UITouch>() 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.formUnion(touches) 
    self.updateTouches() 
} 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { 
    self.touches.subtract(touches) 
    self.updateTouches() 
} 

Für jede Berührung, auf die SKNode die Koordinaten relativ übersetzen. Überprüfen Sie, ob sich die Berührungen im akkumulierten Rahmen des SKNode befinden. Der akkumulierte Rahmen ist der gesamte Begrenzungsbereich des Knotens und aller seiner Nachkommen.

private func isTouching(node: SKNode) -> Bool { 

    guard let parent = node.parent else { 
     return false 
    } 

    let frame = node.calculateAccumulatedFrame() 

    for touch in touches { 

     let coordinate = touch.location(in: parent) 

     if frame.contains(coordinate) { 
      return true 
     } 
    } 

    return false 
} 

Zum Beispiel:

override func update(_ currentTime: NSTimeInterval) { 

    let touchingJump = isTouching(node: jumpButtonNode) 

    if touchingJump { 
     print("jump") 
    } 
} 
+0

Dieser Code kompiliert nicht –

+0

@appzYourLife Noch sollte es. Worauf willst du hinaus? –

+0

@appzYourLife Beziehen Sie sich auf die Tatsache, dass es nicht mit swift 2 kompiliert? –

0

Sie müssen diese Methode

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    print("Touched") 
} 

auf Klasse implementieren zu jedem Knoten, den Sie möchten zugeordnet für Touch-Ereignisse überwachen. Also sollten Sie diese Methode zu jedem Nachkommen Ihrer Haupt SKSpriteNode hinzufügen.

+0

Dieser Code macht nichts. –

+0

@LukeVanIn: Ich habe meiner Methode einen Ausdruck hinzugefügt. Danke für den Hinweis. –

+0

Was meinen Sie mit "Implementieren Sie diese Methode in der Klasse, die jedem Knoten zugeordnet ist, den Sie auf Berührungsereignisse überwachen sollen". Also sollten Sie diese Methode jedem Nachkommen Ihres Haupt-SKSpriteNode hinzufügen? Wo ist das, im Code? Ich war unter dem Eindruck touchingsBegan funktioniert nur in SKView ... aber ich bin verwirrt ... – Confused