如何判断一个节点是否在屏幕上,使用SpriteKit和Swift?

12

我正在尝试弄清楚如何确定一个节点是否在屏幕上可见还是不可见。这仅仅是节点的真/假属性吗?谢谢。(使用Swift SpriteKit)

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

不,节点上没有任何属性表明精灵是否在屏幕上。而且当节点离开屏幕时也没有任何通知。你需要自己计算。你可以从这里开始:http://stackoverflow.com/a/25044232/3402095 另一个可能的解决方案是在场景周围创建基于边缘的物理体,当节点离开屏幕时didBeginContact将被触发(我猜这可能是更高效的解决方案)。在SO上搜索相关内容。 - Whirlwind
6个回答

20
您可以使用以下内容来测试节点是否在场景中:
if (!intersectsNode(sprite)) {
  println("node is not in the scene")
}

这假设selfSKScene的子类,例如GameScene


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

6
这里最好的答案是:
if scene.frame.contains(myNode.position) {
//do stuff
}

"intersect"方法非常耗费计算资源,如果在多个实例上使用可能会导致卡顿。


3

0
如果您的SKScene适合其包含的view,那么这应该可以工作:
if !node.intersectsNode(node.parent!) {
     // node is off-scene/out-of-view
}

其中node是属于你的SKScene子节点的SKNode


0
不直接,但你可以使用它的位置来进行检查。因此,你可以这样做:
if (/*the node's position is between 0 and the screen's .x and .y*/) {
    //on screen
}

希望这能有所帮助 :)

这段代码更多是为了给他一个想法,而不是实际的代码。我修改了它以使其更加清晰明了。 - LinusGeffarth

0
你可以使用CGRectIntersectsRect,提供你的SKSpriteNodeSKSceneframe。例如:
if !CGRectIntersectsRect(frame, spriteNode.frame) {
    // Outside the bounds of the scene because the frames are no longer intersecting.
}

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