【问题标题】:Finding touched SKNode when a child of SCNScene overlaySKScene当SCNScene覆盖SKScene的孩子时找到触摸的SKNode
【发布时间】:2015-03-16 04:05:49
【问题描述】:

我有一个 SCNScene 用于我正在构建的 3D 游戏。我使用 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 找到 nil 结果。

我由 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 节点上触摸,那么即使默认为 userInteractionEnabled=false,它也会返回 hudRoot 节点。

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

【问题讨论】:

标签: ios swift sprite-kit scenekit


【解决方案1】:

尝试改变:

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

收件人:

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

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

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

希望这会有所帮助,或者至少可以提示您可能遇到的问题。

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2018-12-31
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多