Overring touchesEnded in SKSpriteNode - 检查场景中是不是有任何节点在点下

Posted

技术标签:

【中文标题】Overring touchesEnded in SKSpriteNode - 检查场景中是不是有任何节点在点下【英文标题】:Overring touchesEnded in SKSpriteNode - check if any node in scene is under pointOverring touchesEnded in SKSpriteNode - 检查场景中是否有任何节点在点下 【发布时间】:2017-01-11 20:32:32 【问题描述】:

我不得不在具有子节点的 SKSpriteNode 子类中覆盖 touchesBegan 和 touchesEnded(因为我想在子节点上传播触摸事件)

touchesBegan 工作正常,但我遇到的问题是 touchesEnded 检查同一个精灵是否仍在用户手指下。

无论我尝试什么,我都不会在那时的地点节点列表中获得对“自我”的引用

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 
        print("touched ended")
        for t in touches 
            let allNodes = nodes(at: t.location(in: self.scene!))
            print(allNodes)
        
    

t.location(in: self.scene!) 是否应该返回我正在寻找的内容?我也试过 self.scene?.view 但这也返回一个空节点列表。

如何检查 touchesEnded 触摸是否仍在此 SKSpriteNode 上?或者如果他们移动了手指,检查它是否在一个完全不同的节点上?我想我需要将它转换回整个场景坐标,我认为 t.location(in: self.scene.view)) 会怎么做。我的另一个想法是在主场景文件上使用某种委托方法,但是 touch.location 是否与被点击的节点相关?

【问题讨论】:

【参考方案1】:

您正在检查 self.. 中的节点。这里的 self 是子类父节点。您应该检查主场景中的节点,这将正确显示子类节点:

let allNodes = self.scene!.nodes(at: t.location(in: self.scene!))

您还可以使用各种convertconvertPoint 方法来执行此操作。

【讨论】:

我知道 self 是子类节点,但不应该在 self.scene 中定位然后返回场景中的位置?因为场景应该是场景,所以这个节点包含在 allNodes 行中。 哦,我错过了。让我试试看。 抱歉 foo 位令人困惑,因为我试图调试坐标是什么。我已经编辑了问题以使其更明显 修复它:let allNodes = self.scene!.nodes(at: t.location(in: self.scene!)) @TommyBs @TommyBs 你调用了你的子类方法nodes() 而不是场景的nodes() .. :P 这正是我所说的,但我仍然错过了那部分哈哈。 XD

以上是关于Overring touchesEnded in SKSpriteNode - 检查场景中是不是有任何节点在点下的主要内容,如果未能解决你的问题,请参考以下文章

从 touchesEnded 获取图像名称

touchesEnded:withEvent: 来自 UIScrollView 第一响应者

调用 touchescancelled 而不是 touchesended

如何启用/禁用 touchesMoved、touchesEnded 和 Swipe Gestures

“touchesEnded”无法识别整个视图

SWIFT:触摸屏幕时未调用 touchesEnded