发现触摸的SKNode当一个孩子SCNScene覆盖SKScene



我有一个SCNScene,用于我正在构建的3D游戏。我使用SCNScene.overlaySKScene在这个场景中放置了一个HUD。

为了在我的 3D 场景中接收点击,我使用手势识别器和 hitTest,这工作正常。

我正在尝试确定我现在在水龙头上添加到HUD SKScene中的SKSpriteNode。这不适用于手势识别器。

看了WWDC 2014 Banana样本后,我认为我在使用替代触摸开始方法(下图)时并没有做任何不同的事情。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    println("touchesBegan")
    let scnView = self.view as SCNView
    let skScene = scnView.overlaySKScene
    let touch: AnyObject? = touches.anyObject()
    let p = touch?.locationInNode(skScene)
    let touchedNode = skScene.nodeAtPoint(p!)
    println("touchedNode (touchedNode.name)")
    super.touchesBegan(touches, withEvent: event)
}

第 2 个打印结果为零。

我由HUD创建:

    scnView.overlaySKScene = SKScene(fileNamed: "HUDScene.sks")
    scnView.overlaySKScene.name = "HUD"
    scnView.overlaySKScene.delegate = self

然后,我向此场景添加根 SKNode

var hudRoot = SKNode()

并将带有userInteractionEnabled=true的SKSpriteNodes添加到这个hudRoot。

touchesStarted 正在被调用,但在接触 SKSpriteNode 时返回 nil。有趣的是,如果我触摸 SKSpriteNode 之外而不是在任何 3D 节点上,那么它会返回 hudRoot 节点,即使它默认为 userInteractionEnabled=false。

现在我已经用苹果自己的香蕉示例检查了我的实现,我没有任何剩余的想法。

尝试更改:

let p = touch?.locationInNode(skScene)
let touchedNode = skScene.nodeAtPoint(p!)

自:

let p = touch?.locationInNode(hudRoot)
let touchedNode = hudRoot.nodeAtPoint(p!)

我建议这样做的原因是,您尝试与之交互的节点是hudRoot的子节点,因此它们的位置位于hudRoots坐标系中。您当前获取的触摸位置位于 skScene 的坐标系中。

如果上述方法不能解决您的问题,请尝试将触摸位置记录到控制台,并将您获得的内容与预期的内容进行比较。

希望这有所帮助,或者至少能提示你的问题可能是什么。

最新更新