1

我查看了无数参考资料,试图理解为什么我的场景没有像我预期的那样运行,例如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)")
            }
        }
4

2 回答 2

0

我有几层节点,因为我在游戏上使用了带有按钮的遮罩来进行选择和前进。在我制作“startState:Bool = true”并在单击开始屏幕时将其更新为false之前,我遇到了按钮无法正常工作的问题。然后,我在该起始页上的每个按钮都有 && startState==true 以进行点击。可能是您的点击被记录了 - 但它不是您认为您正在使用的节点。我会将 print("NodeXXX") 放在 touches 的每个条目上,并给它一个唯一的名称,这样您就可以看到实际发生触摸的位置。

希望有帮助。

最好的问候, mpe

于 2016-09-14T17:11:16.053 回答
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()
        }
    }
}
于 2018-11-03T17:55:11.880 回答