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

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

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

【问题讨论】:

    标签: objective-c sprite-kit skspritenode


    【解决方案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,那么这不会决定哪个节点被带到“最前面”。我建议删除此答案。
        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-03
        • 2019-08-04
        • 2011-05-20
        相关资源
        最近更新 更多