2016-04-10 8 views
1

Ich habe Probleme mit einem der Knoten in meiner Szene.Swift + SpriteKit - Button ist anklickbar, auch wenn nicht sichtbar

Ich habe eine Schaltfläche:

func createAttackButton() { 
    attackButton.zPosition = 1 
    attackButton.anchorPoint = CGPointZero 
    attackButton.position = CGPointMake(20, 20) 
    attackButton.size = CGSize(width: 150, height: 40) 

    addChild(attackButton) 

} 

Diese Funktion wird aufgerufen, wenn der Kontakt mit dem Feind gemacht wird.

Um eine Funktion aus dieser Taste verwende ich die touchesBegan() Func laufen:

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

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 

     if attackButton.containsPoint(location) { 

      print("Attack Button Clicked") 

     } 
    } 
} 

Sobald der Feind ich den Angriff Button-Knoten entfernen zerstört wurde:

attackButton.removeFromParent() 

jedoch in der Bereich, in dem der Angriffsknopf erscheint, nachdem er entfernt wurde, kann dieser Bereich noch angeklickt werden.

Irgendwelche Ideen?

Antwort

2

Es scheint, dass containsPoint, ob der Knoten dem übergeordneten Element hinzugefügt wird oder nicht, sich genauso verhält. Mittel, es wird immer true zurückgeben, wenn der gegebene Punkt innerhalb des Koordinatensystems des Elternteils (in Ihrem Fall, Knopfes) liegt.

Sie können dies überprüfen, indem Sie die attackButton initialisieren, ohne sie der Szene hinzuzufügen. Wenn Sie in der unteren linken Ecke der Szene auf tippen, wird die Nachricht von touchesBegan weiterhin gedruckt.

Ich schätze, dies geschieht aufgrund der Tatsache, dass jeder Knoten seine position-Eigenschaft standardmäßig auf CGPoint(0,0) festgelegt hat. Auch in Ihrem Fall hat die Schaltfläche ihre Größe. Und es wird seine Größe und Position auch dann haben, wenn es nicht zu seinem Elternteil hinzugefügt wird (oder wenn es von seinem Elternteil entfernt wird), weil es offensichtlich als eine Eigenschaft definiert ist und es einen starken Bezug darauf gibt.

+1

Ja, containsPoint ist ein einfacher Punkt zum direkten Vergleich, es wird kein Elternteil benötigt, damit es funktioniert. 'Enthält die Grenze des Knotens diesen Punkt?' Ist im Grunde, was die Funktion tut. Da die Position nicht optional ist, können Sie containsPoint immer passierbar haben, es sei denn, es ist eine Breite und Höhe von Null möglich, nicht sicher, ob dies zulässig ist. – Knight0fDragon