ios 检测Apple Watch上的SKNode何时被点击

i5desfxk  于 2023-03-14  发布在  iOS
关注(0)|答案(1)|浏览(208)

我正在使用SpriteKit为Apple Watch编写一个应用程序,因此我无法访问touchesBegan等功能,我必须使用WKTapGestureRecognizer来检测点击,这没什么大不了的,但我在检测节点上的点击时遇到了问题。

@IBAction func handleTap(tapGestureRecognizer: WKTapGestureRecognizer){
    scene?.didTap(tapGesture: tapGestureRecognizer)
}

在我的场景文件中

func didTap(tapGesture:WKTapGestureRecognizer) {
    let position = tapGesture.locationInObject()
    let hitNodes = self.nodes(at: position)
    if hitNodes.contains(labelNode) {
    labelNode.text = "tapped!"
}

问题是Tap手势识别器给了我触摸点的绝对坐标(例如11.0、5,0),而我的节点相对于屏幕中心定位(因此其位置是-0.99,-11.29,即使是在屏幕的中心)因此,敲击击中节点而不是在实际敲击它时,但是当我点击屏幕左上角时,我到处搜索,看起来这是解决问题的方法,但我没有找到有同样问题的人。节点是通过编辑器添加的。我做错了什么?

fquxozlt

fquxozlt1#

所以你的想法是对的,但是你错了,因为hitNodes是一个SKNode数组,那些是新创建的,所以当你使用hitNodes时,包含了labelNode的地址,和新创建的,被比较的SKNode的地址是完全不同的,因此它永远不会被点击。
这是我要做的。这会在我的场景文件中。你的InterfaceController类是正确的。

func didTap(tapGesture:WKTapGestureRecognizer) {
    let position = tapGesture.locationInObject()
    if labelNode.contains(position) {
        labelNode.text = "tapped!"
    }
}

或者另一种方法是这样的,我喜欢这种方法,因为你只有一个函数,在WKInterfaceController中,你不需要场景文件中的函数。

@IBAction func tapOnScreenAct(_ sender: WKGestureRecognizer) {
    if scene.labelNode.contains(sender.locationInObject()) {
        scene.labelNode.text = "tapped!"
    }    
}

无论哪种方式,两者都应该工作。让我知道,如果你有任何更多的问题或澄清。

相关问题