1

我正在使用 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*/

        }

    }
4

2 回答 2

2

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

我会试试这个:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches {
        if nodeAtPoint(touch.locationInNode(self)) == lemonadeLabel {
            println("lemonadeLabel pressed")
            lemonadeLabel.removeFromParent()
        }
    }
}

您基本上确定柠檬水标签是否是该位置的节点,如果是,则将其删除。由于您与场景中添加的节点进行比较,如果它消失了,它将不会在那里进行比较;)

于 2015-01-30T02:28:08.140 回答
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()

    }

}
于 2015-01-30T02:25:30.120 回答