在SCNScene overlaySKScene的孩子时找到触摸的SKNode

时间:2015-01-17 18:27:37

标签: ios swift sprite-kit scenekit

我正在制作一款用于3D游戏的SCNScene。我使用SCNScene.overlaySKScene在这个场景中定位了一个HUD。

为了在我的3D场景上接收点击,我使用手势识别器和hitTest,这很好。

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

看过WWDC 2014 Banana样本后,我不认为我在使用替代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。

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

1 个答案:

答案 0 :(得分:1)

尝试更改:

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

要:

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

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

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

希望这有助于或者至少可以暗示您的问题可能是什么。