如何将SKSpriteNode置于最上层?

37

如何将 SKSpriteNode 置于所有其他节点之前?

在 UIView 中,可以使用 bringSubviewToFront 将一个 UIView 置于其他视图前面。

4个回答

59
您不能“将其置于前面”,但是您可以更改其zPosition
节点的zPosition越高,它就越晚被渲染。
因此,如果您有三个节点,其zPositions分别为-1、0和1,那么-1将出现在后面。然后是0。然后1将出现在前面。
如果它们都使用默认的zPosition 0.0,则按它们出现在父节点的子数组中的顺序呈现它们。
您可以在文档中阅读所有内容。 https://developer.apple.com/documentation/spritekit/sknode

1
谢谢你的帮助。这正是我所需要的。现在我可以将SKSpriteNode置于背景的前面。 - Phuong Ly
2
你还可以创建两个或更多的图层。一个用于背景,另一个用于玩家等元素。添加这些图层的顺序将影响图层叠放顺序,所以先添加背景图层。 - DogCoffee

5

SWIFT 4
我通常创建枚举来确定zPositions,这样我就可以简单地管理不同的图层:

enum ZPositions: Int {
    case background
    case foreground
    case player
    case otherNodes
}
  • “case background”是较低的位置,等同于默认的0位置;
  • “case foreground”= 1
  • “case player” = 2
  • “case other nodes” = 3

因此,当您设置一个新项目时,可以通过以下方式简单地给它赋予zPosition:

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

1
这个扩展为SKNode添加了一个“bringToFront”方法。当“zPosition”不合适时,你可以使用它来依赖兄弟节点的顺序。
extension SKNode {
    func bringToFront() {
        guard let parent = parent else { return }
        removeFromParent()
        parent.addChild(self)
    }
}

`


如果父节点已经有比当前节点更高的zPosition的子节点,似乎这不会将它带到最前面。默认情况下,它不是0.0位置吗? - bhause
正如注释所说,这是在某些情况下zPosition不合适时使用的。 - Graham Perks

0
如果您想将节点置于最前面,请使用以下代码: yourNode.zPosition = 1 如果您想将节点置于最后面,请使用以下代码: yourNode.zPosition = -1 如果您想将节点置于与其他节点相同的级别(因为默认情况下它被设置为此值),请使用以下代码: yourNode.zPosition = 0

并不完全正确。#1 - 这假设没有任何一个zPosition高于1,#2 - 如果您将多个节点设置为zPosition 1,则无法确定哪个节点被带到“最前面”。我建议删除这个答案。 - Tyler A.

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