如何将 SKSpriteNode 放在前面?

Posted

技术标签:

【中文标题】如何将 SKSpriteNode 放在前面?【英文标题】:How to bring a SKSpriteNode to front? 【发布时间】:2013-10-09 22:01:00 【问题描述】:

如何将 SKSpriteNode 放在所有其他节点的前面?

使用 UIView,我可以使用 bringSubviewToFront 将 uiview 带到其他视图的前面。

【问题讨论】:

【参考方案1】:

你不能“把它带到前面”,但你可以改变它的zPosition

节点的zPosition 越高,渲染越晚。

因此,如果您有三个节点,zPositions 分别为 -1、0 和 1,那么 -1 将出现在后面。然后是0。然后1会出现在最前面。

如果它们都使用默认的zPosition 0.0,那么它们将按照它们在父节点的子数组中出现的顺序呈现。

您可以在文档中阅读所有内容。

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

【讨论】:

感谢您的帮助。这就是我需要的。现在我可以将 SKSpriteNode 带到背景前面了。 您也可以创建 2 个图层(或更多)。一个用于背景,另一个用于播放器等。添加这些的顺序会影响分层,因此请先添加背景层。【参考方案2】:

SWIFT 4 我通常创建枚举来建立 zPositions,以便我可以简单地管理不同的层:

enum ZPositions: Int 
    case background
    case foreground
    case player
    case otherNodes

“案例背景”为较低位置,等于默认位置0; “案例前景”= 1 “案例播放器”= 2 “案例其他节点”= 3

因此,当您设置一个新项目时,您可以通过以下方式简单地为其指定 zPosition:

button.zPosition = CGFloat(ZPosition.otherNodes.rawValue)

(按钮现在具有最高的 zPosition)

【讨论】:

【参考方案3】:

这个扩展为 SKNode 添加了一个bringToFront 方法。这对于 zPosition 不合适并且您想依赖同级排序的时候非常有用。

extension SKNode 
    func bringToFront() 
        guard let parent = parent else  return 
        removeFromParent()
        parent.addChild(self)
    

`

【讨论】:

【参考方案4】:

如果你想把一个节点放在最前面使用这个:

yourNode.zPosition = 1

或者到最后面:

yourNode.zPosition = -1

或与其他节点相同的级别(默认设置为该值):

yourNode.zPosition = 0

【讨论】:

不完全正确。 #1 - 这假设没有任何东西的 zPosition 高于 1,#2 - 如果您将多个节点设置为 zPosition 1,那么这不会决定哪个节点被带到“最前面”。我建议删除此答案。

以上是关于如何将 SKSpriteNode 放在前面?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JPanel 放在 JFrame 的前面

如何将 UICollectionViewCell 放在前面?

表视图,如何将删除按钮放在前面?

如何防止alamofire将“&”符号放在参数前面

无论用户访问的内容类型如何,将 CloudFront 放在 ALB 前面是不是更好?

如何将 SKPhysicsBody(texture: size:) 居中于 SKSpriteNode 锚点以外的点