当SCNScene的overlaySKScene的子节点被触碰时,如何找到被触碰的SKNode

3
我有一个SCNScene,用于构建3D游戏。我使用SCNScene.overlaySKScene将HUD放在这个场景上。
为了在我的3D场景中接收点击事件,我使用手势识别器和hitTest,这很好用。
现在,我试图确定我在点击时添加到HUD SKScene的SKSpriteNodes。但手势识别器无法实现此功能。
在查看了WWDC 2014的香蕉示例后,我认为我在使用替代touchesBegan方法方面并没有做什么不同(如下所示)。
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)
}

第二个println找到了一个空的结果。

我使用HUD创建:

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

我随后向这个场景添加了一个根SKNode。
var hudRoot = SKNode()

把userInteractionEnabled设置为true的SKSpriteNodes添加到hudRoot中。

当调用touchesBegan时,触摸SKSpriteNodes时返回nil。有趣的是,如果我在SKSpriteNodes之外触摸并且没有触摸任何3D节点,则即使hudRoot默认为userInteractionEnabled=false,它也会返回hudRoot节点。

现在我已经使用了苹果自己的Bananas示例检查了我的实现,但是我没有剩余的想法。


你有得到答案吗? 你试过这个吗:http://forum.yourwebapp.mobi/combining-the-power-of-spritekit-and-scenekit/ - Aviad Ben Dov
1个回答

1
尝试更改:

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

To:

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

我建议这样做是因为您尝试与hudRoot的子节点进行交互,因此它们的位置在hudRoot的坐标系中。您当前获取的触摸位置在skScene的坐标系中。
如果上述方法无法解决您的问题,请将触摸位置记录到控制台,并将其与您期望的位置进行比较。
希望这可以帮助您或者至少给您提供有关问题可能所在的提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接