【问题标题】:touchesMoved called without moving a fingertouchesMoved 在不移动手指的情况下调用
【发布时间】:2017-06-16 20:46:08
【问题描述】:

我正在尝试使用一个拇指棒和两个按钮来实现用户控制节点。我创建了带有控制元素的单独 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)
}

【问题讨论】:

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


    【解决方案1】:

    您可以尝试比较翻译,如果没有任何变化,则不要执行任何操作,因此您的 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)
                }
            }
        }
    }
    

    【讨论】:

    • 抱歉回复晚了。它没有帮助,因为触摸位置已更改。我尝试设置一些阈值,但也无济于事,有时触摸位置有很大差异。我还发现 touchBegan 和 touchEnded 也调用了,但很少
    【解决方案2】:

    这个问题似乎只在调试过程中出现,所以我认为这是一些调试器问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多