相对于其父项,SKNode的zPosition?

时间:2015-07-22 08:30:50

标签: swift sprite-kit

我一直认为SKNode的zPosition是相对于它的父级的,但是现在我遇到了相反的效果。

我的场景中有两个父SKNode,其zPosition为1(node1)和2(node2)。我想要实现的是node2应该总是分层ABOVE node1。但不幸的是,node1的子节点(其zPosition为1-50)都位于node2的子节点之上(当前没有zPosition)。有没有办法解决这个问题(除了给node2一个超过50的zPosition)?也许某种布尔参数来设置所有子节点' zPosition相对于其父级?任何帮助将不胜感激!

编辑:为了更清楚,这里是所有元素的层次结构:

  • node1:SKNode(zPosition 1)
    • child1:SKNode(zPosition 1)
    • child2:SKNode(zPosition 2)
    • child3:SKNode(zPosition 3)
    • ...
    • child50:SKNode(zPosition 50)
  • node2:SKNode(zPosition 2)
    • child1:SKLabelNode(没有zPosition)
    • child2:SKLabelNode(没有zPosition)
    • child3:SKLabelNode(没有zPosition)
    • ...
    • child50:SKLabelNode(没有zPosition)

EDIT2:这是我的GameScene课程的一个非常简化的版本:

import SpriteKit

class GameScene: SKScene {

    let gameNode = SKNode()
    let node1 = SKNode()
    let node2 = SKNode()

    let nodeSize:CGFloat = 50.0
    let spacing:CGFloat = 5.0

    required init(coder aDecoder: NSCoder) {
        fatalError("NSCoder not supported")
    }

    override init(size: CGSize) {
        super.init(size: size)

        self.addChild(gameNode)

        node1.name = "node1"
        node2.name = "node2"

        node1.zPosition = 1
        node2.zPosition = 2

        gameNode.addChild(node1)
        gameNode.addChild(node2)

        // add children to node1
        for i in 1..<10 {
            let child = SKSpriteNode(color: UIColor.redColor(), size: CGSize(width: nodeSize, height: nodeSize))
            child.position = CGPointMake((nodeSize + spacing) * CGFloat(i), 0)
            child.zPosition = CGFloat(i)
            self.node1.addChild(child)
        }

        // add children to node2
        for i in 1..<10 {
            let child = SKLabelNode(fontNamed: "Avenir Black")
            child.position = CGPoint(x: (nodeSize + spacing) * CGFloat(i), y: 0)
            child.text = "label\(i)"
            child.fontSize = 10
            child.fontColor = UIColor.blackColor()
            self.node2.addChild(child)
        }
    }
}

运行它时,您可以看到只有node2(label1)的第一个子节点位于node1的第一个子节点之上(因为它们具有相同的zPosition)。所有其他的都在node1的子节点下面。

1 个答案:

答案 0 :(得分:11)

在阅读Apple Documentation时,您可以找到:

  

维护节点子节点的顺序可能需要大量工作。相反,您可以在场景中为每个节点指定一个显式高度。您可以通过设置节点的zPosition属性来完成此操作。 z位置是节点相对于其父节点的高度,就像节点的position属性表示相对于父节点的x和y位置一样。因此,您使用z位置将节点放置在父节点的上方或下方。

     

考虑z位置时,节点树的方式如下   渲染:

     
      
  • 计算每个节点的全局z位置。
  •   
  • 按照从最小z值到最大z值的顺序绘制节点。
  •   
  • 如果两个节点共享相同的z值,则首先呈现祖先,并按子顺序呈现兄弟节点。
  •   

我发现 - 我不知道它是这样的 - 是孩子zPosition计算总结他们的父母zPosition,所以如果node1.zPosition + (node1's)child3.zPosition = 4node2.zPosition + (node2's)child3.zPosition = 3,node1的孩子将在上面画。

解决方案:将node2.zPosition设置为大于(node1's)lastChild.zPosition + node1.zPosition