SKSpriteNode zPosition绘图?

时间:2017-11-09 14:20:54

标签: ios swift sprite-kit

我试图创造许多重叠并相互隐藏的精灵。

class BubbleNode: SKSpriteNode {

init() {
    let texture = SKTexture(imageNamed: "body")
    super.init(texture: texture, color: .clear, size: texture.size())

    let eye = SKSpriteNode(imageNamed: "eye")
    eye.zPosition = 1
    eye.position = CGPoint(x: -20, y: 0)

    let eye_right = eye.copy() as! SKSpriteNode
    eye_right.position = CGPoint(x: 20, y: 0)

    let mouth_smiling = SKSpriteNode(imageNamed: "mouth_smiling")
    mouth_smiling.zPosition = 1
    mouth_smiling.position = CGPoint(x: 0, y: -20)

    addChild(eye)
    addChild(eye_right)
    addChild(mouth_smiling)
}
}

从我的观点来看,子元素的zPosition是有道理的。

我正在添加这样的气泡:

func touchDown(atPoint pos : CGPoint) {
    let n = BubbleNode()
    n.position = pos
    self.addChild(n)
}

所以我期望精灵重叠并隐藏不可见的部分。

相反,我首先渲染身体,然后将眼睛和嘴巴呈现为兄弟姐妹:

bubbles' child elements rendered in wrong order

我试图翻转view.ignoresSiblingOrder,但它没有帮助。

2 个答案:

答案 0 :(得分:2)

管理z顺序可能很棘手。

它的工作方式是zPosition相对于父zPosition,zPositioning只有一次传递。

因此,如果你在zPosition 1的zPosition 0眼睛和zPosition 2处的虹膜有一张脸,

然后当你去渲染2个面时,这是它将在

绘制的顺序
face 1 --- z0
face 2 ----z0
eye 1 --- z1
eye 2 --- z1
iris 1 ---z3 (because 2 + 1 + 0 is 3)
iris 2 --- z3

最好将面部的所有部分保留为0,只需更改面部的zPosition

face 1 --- z0
eye 1 --- z0
iris 1 ---z0 

face 2 ----z1
eye 2 --- z1 (because 1 + 0 is 1)
iris 2 --- z1

现在,如果由于某种原因,您需要添加到面部的一部分的zposition,然后跟踪它以确定zvalue范围。然后确保你的面部zPosition在z深度中相隔很远

face 1 --- z0
eye 1 --- z0
iris 1 ---z1   (depth of 2 z layers)

face 2 ----z2  (make sure we are at 2)
eye 2 --- z2 (because 2 + 0 is 1)
iris 2 --- z2

答案 1 :(得分:1)

节点设置zPosition,如下所示:

var i: CGFloat = 0

func touchUp(atPoint pos : CGPoint) {
    let b = BubbleNode()
    b.position = pos
    b.zPosition = i
    i += 10
    self.addChild(b)
}

如果设置相同的zPosition节点,它们将处于相同的深度,即使节点是不同父节点的子节点。

也许有人有更好的解释......