如何检测是否触摸了子节点:Sprite Kit

时间:2016-07-10 20:45:14

标签: ios swift sprite-kit touch skspritenode

我有SKSpriteNode。这个SKSpriteNode有几个孩子。如何检测是否被触摸过?现在,让我说清楚,我已经知道在SpriteKit中设置一个按钮,我尝试使用我用来检测主要父节点是否被触摸的相同代码,但它没有工作。按钮没有做任何事情。有没有办法来解决这个问题?此外,我已经尝试将子节点的用户交互设置为true。

2 个答案:

答案 0 :(得分:2)

这是跟踪连续触摸的一种方法(即方向箭头)。

您需要跟踪SKScene节点或父视图控制器中的触摸:

var touches = Set<UITouch>()

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.touches.formUnion(touches)
    self.updateTouches()
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.touches.formUnion(touches)
    self.updateTouches()
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.touches.subtract(touches)
    self.updateTouches()
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.touches.subtract(touches)
    self.updateTouches()
}

对于每次触摸,将坐标转换为相对于SKNode。检查是否有任何触摸在SKNode的累积帧内。累积的帧是节点及其所有后代的总边界区域。

private func isTouching(node: SKNode) -> Bool {

    guard let parent = node.parent else {
        return false
    }

    let frame = node.calculateAccumulatedFrame()

    for touch in touches {

        let coordinate = touch.location(in: parent)

        if frame.contains(coordinate) {
            return true
        }
    }

    return false
}

例如:

override func update(_ currentTime: NSTimeInterval) {

    let touchingJump = isTouching(node: jumpButtonNode)

    if touchingJump {
        print("jump")
    }
}

答案 1 :(得分:0)

您需要实施此方法

SKSpriteNode

在与要监视触摸事件的每个节点关联的类上。因此,您应该将此方法添加到主fill的每个后代。