SpriteKit - 为什么没有检测到SKNode的触摸

时间:2016-09-14 15:48:29

标签: swift sprite-kit zposition

我已经阅读了无数的参考文献,试图理解为什么我的场景表现不像我预期的那样,例如this

这是我非常简单的SKScene(2个子节点):

  • 场景中有一个SpriteNode(将整个场景作为背景图像覆盖)。这有一个zPosition = 0。
  • 场景中有第二个节点(SKNode),它本身有另一个孩子(最多2个级别)。这有一个zPosiiton - 2。
  • 所有节点都有.userInteractionEnabled = false

问题:

当我点击任何地方时,我看到的是第一个孩子(SpriteNode)被触摸。第二个孩子(SKNode)从未被触摸检测过。

请注意,节点的z排序正如我所期望的那样呈现。触摸检测似乎没有效果。

我的touchesBegan方法的片段:

       for touch in touches {
            let touchLocation = touch.locationInNode(self)
            let sceneTouchPoint = self.convertPointToView(touchLocation)
            let touchedNode = self.nodeAtPoint(sceneTouchPoint)
            if (touchedNode.name != nil) {
                print("Touched = \(touchedNode.name! as String)")
            }
        }

2 个答案:

答案 0 :(得分:0)

我有几层节点,因为我在游戏中使用了一个带按钮的面具来进行选择并向前移动。我做了一个" startState:Bool = true"单击开始屏幕时将其更新为false。然后,我在开始页面上的每个按钮都有&& startState == true表示有点击。可能是您的点击被记录 - 但它不是您认为正在使用的节点。我会在每个条目中添加print(" NodeXXX")并给它一个唯一的名称,这样你就可以看到触摸实际发生的位置。

希望有所帮助。

祝你好运, MPE

答案 1 :(得分:0)

我遇到了类似的问题(z:999中的背景+在z:<999中产生了“鸭子”节点),我在Swift 4中使用以下代码解决了这个问题:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch:UITouch = touches.first!
    let positionInScene = touch.location(in: self)
    let touchedNodes = self.nodes(at: positionInScene)
    for touch in touchedNodes {
        let touchName = touch.name
        if (touchName != nil && touchName!.hasPrefix("pato_")) {
            touch.removeFromParent()
        }
    }
}