SKLabelNode会消失,但仍然是可点击的

我正在使用SpriteKit和Swift制作游戏,运行Xcode 6.我有一个SKLabelNode ,在这个例子中我们称之为myLabelNode 。 当我调用myLabelNode.removeFromParent()它会从场景中删除节点,因为它应该。 节点数量下降1,并且在屏幕上的任何地方都不可见。 但是,当我点击myLabelNode以前的位置时,我的程序仍然会调出只有在触摸myLabelNode时才会发生的function。 我也尝试将myLabelNode.removeFromParent()myLabelNode.hidden = true结合起来,但它仍然是可触摸的,即使它不应该调用该函数。 我应该如何解决这个问题? 我应该使用不同的方法吗? 这是否应该发生?

编辑:

  let lemonadeLabel = SKLabelNode(fontNamed: "Optima-ExtraBlack") override func didMoveToView(view: SKView) { lemonadeLabel.text = "Lemonade Stand" lemonadeLabel.fontSize = 24 lemonadeLabel.fontColor = SKColor.yellowColor() lemonadeLabel.position = CGPoint(x: size.width/2, y: size.height*0.66) lemonadeLabel.zPosition = 2.0 addChild(lemonadeLabel) } override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { let touch = touches.anyObject() as UITouch let location = touch.locationInNode(self) if lemonadeLabel.containsPoint(location) { println("lemonadeLabel pressed") lemonadeLabel.removeFromParent() /*lemonadeLabel is now be removed, however if I click the area where it used to be, "lemonadeLabel pressed" will print to the console*/ } } 

您正在尝试确定是否正在触摸constrainPoints的位置。 即使你从场景中删除标签,它仍然是一个内存中的对象,也就是说,你可以稍后再重新添加它。它仍然具有包括位置等所有属性。

我会试试这个:

 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { for touch: AnyObject in touches { if nodeAtPoint(touch.locationInNode(self)) == lemonadeLabel { println("lemonadeLabel pressed") lemonadeLabel.removeFromParent() } } } 

你基本上确定lemonadeLabel是否在该位置的节点,如果是的话,你删除它。 既然你在场景中添加的节点比较,如果它消失了,它不会在那里比较;)

你的labelNode可能不在SKScene了。 这并不意味着它不会响应containsPoint函数。 labelNode仍然有一个位置分配给它,它可以使用containsPoint函数计算一个点是否落在它的内部。

相反,你可以试试这个。

 override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { let touch = touches.anyObject() as UITouch let location = touch.locationInNode(self) if self.nodeAtPoint(location) === lemonadeLabel { println("lemonadeLabel pressed") lemonadeLabel.removeFromParent() } }