touchesMoved在没有移动手指的情况下调用

时间:2017-02-16 07:28:03

标签: ios swift sprite-kit user-controls touchesmoved

我试图用一个ThumbStick和两个按钮来实现用户控制节点。我在其上创建了带有控制元素的单独SKSpriteNode,并覆盖父节点的触摸事件以处理用户触摸。

问题在于,当我启动触摸屏时,即使我不动了手指,也会多次调用touchesMoved。

这是我的触摸事件代码:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)

    for touch in touches {
        let touchPoint = touch.location(in: self)

        touchStatusLabel.text = String(format: "TOUCH BEGAN %@", arguments:[NSStringFromCGPoint(touchPoint)])

        if aButton.frame.contains(touchPoint) {
            NSLog("A BUTTON PRESSED")
            delegate?.controlInputNode(self, beganTouchButtonWithName: aButton.name!)
        }
        else if bButton.frame.contains(touchPoint) {
            NSLog("B BUTTON PRESSED")
            delegate?.controlInputNode(self, beganTouchButtonWithName: bButton.name!)
        }

        else if touchPoint.x < 0 && touchPoint.y < 0 {
            NSLog("THUMBSTICK PRESSED")
            leftThumbStickNode.touchesBegan([touch], with: event)
            leftThumbStickNode.position = pointByCheckingControlOffset(touchPoint)
        }
    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)

    for touch in touches {
        let touchPoint = touch.location(in: self)
        touchStatusLabel.text = String(format: "TOUCH MOVED %@", arguments:[NSStringFromCGPoint(touchPoint)])

        if !aButton.frame.contains(touchPoint) && !bButton.frame.contains(touchPoint) {
            if touchPoint.x < 0 && touchPoint.y < 0 {
                leftThumbStickNode.touchesMoved([touch], with: event)
            }
        }
    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesEnded(touches, with: event)

    for touch in touches {
        let touchPoint = touch.location(in: self)
        touchStatusLabel.text = String(format: "TOUCH ENDED %@", arguments:[NSStringFromCGPoint(touchPoint)])

        let node = atPoint(touchPoint)

        if node == aButton || node == bButton {
            delegate?.controlInputNode(self, endTouchButtonWithName: node.name!)
        }

        else {
            leftThumbStickNode.touchesEnded([touch], with: event)
        }
    }
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesCancelled(touches, with: event)

    NSLog("TOUCH CANCELED")

    leftThumbStickNode.touchesCancelled(touches, with: event)
}

2 个答案:

答案 0 :(得分:0)

您可以尝试比较翻译,如果没有任何改变,那么就不要做任何事情,所以你的touchesMoved函数将会是这样的;

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesMoved(touches, with: event)

    for touch in touches {
        let location = touch.location(in: self)
        let previousLocation = touch.previousLocation(in: self)

        let translation = CGPoint(x: location.x - previousLocation.x, y: location.y - previousLocation.y)
        if translation == CGPoint.zero {
            continue
        }

        touchStatusLabel.text = String(format: "TOUCH MOVED %@", arguments:[NSStringFromCGPoint(location)])

        if !aButton.frame.contains(location) && !bButton.frame.contains(location) {
            if location.x < 0 && location.y < 0 {
                leftThumbStickNode.touchesMoved([touch], with: event)
            }
        }
    }
}

答案 1 :(得分:0)

看来这个问题只在调试期间发生,所以我认为这是一些调试器问题