Swift SKSpriteNode将消失但仍可点击

时间:2016-03-15 20:47:46

标签: swift sprite-kit nodes clickable removechild

SpriteKit和Swift有问题。

我在代码的不同位置将SKSpriteNode添加到场景中 - 其中一些是可点击的,有些则不是。我使用可点击的节点作为播放器的菜单。所以,例如 - 如果他点击InventoryButtonNode,他会跳入库存。在库存中,他可以触摸PlayButton并跳回游戏。所以,首先我添加节点:

override func didMoveToView(view: SKView) {
    PlayButton = SKSpriteNode(imageNamed: "PlayButton")
    PlayButton.size = CGSize(width: 100, height: 100)
    PlayButton.position = CGPoint ... // not important
    PlayButton.zPosition = 200
    PlayButton.name = "PlayButton"
    self.addChild(PlayButton)
    InventoryButton = SKSpriteNode(imageNamed: "InventoryButton")
    InventoryButton.size = CGSize(width: 100, height: 100)
    InventoryButton.position = CGPoint ... // different position than PlayButton
    InventoryButton.zPosition = 200
    InventoryButton.name = "PlayButton"
    self.addChild(InventoryButton)

在覆盖功能touchesBegan中,我使用这些“菜单”-Nodes,例如InventoryButton-Node

if InventoryButton.containsPoint(touch.locationInNode(self)) {
    print("Show Inventory")
    ShowInventory()
}

现在在ShowInventory()函数中,我想从视图中删除那些“菜单”-Buttons,这样我就可以添加其他节点来显示播放器的库存。

func ShowInventory(){
    PlayButton.removeFromParent()
    InventoryButton.removeFromParent()
}

如果我构建并运行它,节点将被删除 - 或者更好地说 - 它们将变得不可见。

因为,如果我现在触摸InventoryButton的位置,我仍然会得到打印“显示库存” - 所以即使节点不可见,该功能仍会对我的触摸作出反应。

我的问题是,我喜欢4种不同的功能,例如ShowInventory() ..我有ShowGame()等等...我希望在这些功能中完全删除节点和“触摸” -Ability ..

我需要一个可以完全删除节点的功能..

我甚至尝试过:

func ShowInventory(){
    self.removeAllChildren()
}

我得到一个没有任何节点的灰色背景..但仍然 - 如果我触摸库存按钮位置的位置,我会调用该函数并打印“显示库存”......这令人沮丧。

1 个答案:

答案 0 :(得分:3)

这是因为您检查按下哪个按钮不会考虑按钮是否可见。

即使某个节点已从其父节点中删除,它仍然具有positionsizecontainsPoint:使用这两个属性来确定点是否在节点

修复它的最简单方法是在检查按钮是否包含该点之前,检查按钮是否有父节点。

if InventoryButton.parrent != nil && InventoryButton.containsPoint(touch.locationInNode(self)) {
    print("Show Inventory")
    ShowInventory()
}