SKLabelNode 将消失但仍可点击
SKLabelNode will disappear but is still clickable
我正在使用 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*/
}
}
您的 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()
}
}
您正在尝试确定约束点的位置是否被触及。即使您从场景中删除标签,它仍然是内存中的一个对象,即:您可以稍后重新添加它。它仍然具有所有属性,包括位置等。
我会试试这个:
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 是否是该位置的节点,如果是,则将其删除。因为你是跟场景中添加的节点比较,如果没了,就不会再比较了;)
我正在使用 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*/
}
}
您的 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()
}
}
您正在尝试确定约束点的位置是否被触及。即使您从场景中删除标签,它仍然是内存中的一个对象,即:您可以稍后重新添加它。它仍然具有所有属性,包括位置等。
我会试试这个:
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 是否是该位置的节点,如果是,则将其删除。因为你是跟场景中添加的节点比较,如果没了,就不会再比较了;)