【问题标题】:How do you tell if a node is on the screen spritekit swift你如何判断一个节点是否在屏幕上 spritekit swift
【发布时间】:2015-05-30 22:22:23
【问题描述】:

我试图弄清楚如何确定节点是在屏幕上还是在屏幕外可见。这只是节点的真/假属性吗? 谢谢。 (使用 swift spritekit)

【问题讨论】:

  • 不,节点上没有任何属性表明精灵在屏幕上或不在屏幕上。节点离开屏幕时也没有任何通知。你应该自己计算。你可以从这个开始:stackoverflow.com/a/25044232/3402095 其他可能的解决方案是在场景周围创建基于边缘的物理体,当节点离开屏幕时,didBeginContact 将被触发(我猜,这可能是一个更高效的解决方案)关于这个搜索 SO .

标签: swift sprite-kit


【解决方案1】:

您可以使用以下方法来测试一个节点是否在场景中:

if (!intersectsNode(sprite)) {
  println("node is not in the scene")
}

这假定selfSKScene 的子类,例如GameScene

【讨论】:

  • 因此,如果您的节点是另一个节点的子节点,这似乎不起作用,那么我该如何检查呢?例如:我有一个名为 backgroundNode 的节点,它的位置是屏幕的中间(场景的锚点是左下角 (0, 0))。然后我将我的子节点添加到 backgroundNode。现在我的子节点的位置是 (0, 0),它是我的 backgroundNode 的中心,所以它出现在屏幕的中间。问题是当我对这个子节点施加力时,它的位置变为负数,并且由于场景帧从 (0, 0) 开始,相交将返回 false。我该如何处理?
  • @Minimi 尝试设置backgroundNode.anchorPoint = CGPoint(x:0.5,y:0.5)backgroundPoint.position = CGPoint.zero。您可能需要相应地更改子节点的位置。
  • 后台节点是一个SKNode,它们没有锚点。我最终使用了为锚点调整的相对框架(与屏幕大小相同,但原点为负)。然后我使用与这个新的相对框架相交。
【解决方案2】:

这里的最佳答案是:

if scene.frame.contains(myNode.position) {
//do stuff
}

“intersect”方法很重,计算量太大,如果在很多实例上使用会产生延迟

【讨论】:

    【解决方案3】:

    如果你在场景中放置了一个 SKCameraNode,你可以使用contains 方法检查一个节点是否在相机的视图内:

    https://developer.apple.com/documentation/spritekit/skcameranode

    您还可以使用containedNodeSet 实例方法获取相机可见的所有节点。

    【讨论】:

      【解决方案4】:

      您可以使用CGRectIntersectsRect 提供SKSpriteNodeframeSKScene。例如:

      if !CGRectIntersectsRect(frame, spriteNode.frame) {
          // Outside the bounds of the scene because the frames are no longer intersecting.
      }
      

      【讨论】:

        【解决方案5】:

        不是直接的,但你可以使用它的位置来检查。因此,您可能会执行以下操作:

        if (/*the node's position is between 0 and the screen's .x and .y*/) {
            //on screen
        }
        

        希望有帮助:)

        【讨论】:

        • 这更像是给他一个想法,而不是实际的代码。我更改了它以使其更清楚。
        【解决方案6】:

        如果您的 SKScene 适合其包含的 view,则应该可以:

        if !node.intersectsNode(node.parent!) {
             // node is off-scene/out-of-view
        }
        

        其中nodeSKNode,它是您的SKScene 的子级。

        【讨论】:

          猜你喜欢
          • 2012-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多