我正在制作一款用于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示例检查了我的实现,我没有任何剩余的想法。
答案 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的坐标系中。
如果上述方法无法解决您的问题,请尝试将触摸位置记录到控制台,并将您获得的内容与您期望的内容进行比较。
希望这有助于或者至少可以暗示您的问题可能是什么。