【问题标题】: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 是否与被点击的节点相关?

【问题讨论】:

    标签: sprite-kit skspritenode


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2017-04-09
    相关资源
    最近更新 更多