Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios SKSpriteNode Z位置图?_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios SKSpriteNode Z位置图?

Ios SKSpriteNode Z位置图?,ios,swift,sprite-kit,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

我正在尝试创建许多相互重叠和隐藏的精灵

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)
}
}
在我看来,子元素的位置是有意义的

我正在添加这样的气泡:

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

func touchUp(atPoint pos : CGPoint) {
    let b = BubbleNode()
    b.position = pos
    b.zPosition = i
    i += 10
    self.addChild(b)
}
所以我希望精灵重叠并隐藏不可见的部分

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


我试图翻转
视图。忽略AssiblingOrder
,但没有帮助。

还为父节点设置一个
zPosition
,如下所示:

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

func touchUp(atPoint pos : CGPoint) {
    let b = BubbleNode()
    b.position = pos
    b.zPosition = i
    i += 10
    self.addChild(b)
}
如果设置相同的节点位置,即使节点是不同父节点的子节点,它们也将位于相同的深度


也许有人有更好的解释…

管理z顺序可能很棘手

它的工作方式是zPosition相对于父zPosition,在zPosition上只有一个过程

如果你有一张脸在Z0位置,眼睛在Z1位置,虹膜在Z2位置

然后,当您转到渲染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,只需更改面的位置即可

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范围。然后确保你的脸在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

谢谢你的回复。有更好的解决办法吗?我试图手动设置zPosition,但zPosition管理很快就变成了一项乏味的任务。因为你需要知道场景中有多少元素。但下面的例子很有效,在操场上测试过