SKLabelNode将消失但仍可点击

时间:2015-01-30 01:54:01

标签: ios swift ios8 sprite-kit sklabelnode

我正在使用SpriteKit和Swift制作游戏,运行Xcode 6.我有一个SKLabelNode,我们称之为myLabelNode。当我调用myLabelNode.removeFromParent()时,它会从场景中删除节点。节点数减少1,并且在屏幕上的任何位置都不可见。但是,当我点击之前myLabelNode所在的位置时,我的程序仍然会调出仅在触摸myLabelNode时才会发生的功能。我也尝试将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*/

        }

    }

2 个答案:

答案 0 :(得分:2)

您正在尝试确定是否正在触摸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是否是该位置的节点,如果是,则将其删除。由于您与场景中添加的节点进行比较,如果它已经消失,则不会进行比较;)

答案 1 :(得分:1)

您的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()

    }

}