【问题标题】:SKSpriteNode zPosition drawing?SKSpriteNode zPosition 绘图?
【发布时间】:2017-11-10 22:31:49
【问题描述】:

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

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)
}

所以我预计精灵会重叠并隐藏不可见的部分。

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

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

【问题讨论】:

    标签: ios swift sprite-kit


    【解决方案1】:

    管理 z 顺序可能很棘手。

    它的工作方式是zPosition是相对于父母zPosition的,在zPositioning处只有1个pass。

    所以如果你的脸在 zPosition 0 眼睛在 zPosition 1,虹膜在 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
    

    现在,如果由于某种原因,您需要添加到面部一部分的 z 位置,然后跟踪此以确定 z 值范围。然后确保你的脸 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
    

    【讨论】:

      【解决方案2】:

      还为 parent 节点设置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,它们将处于相同的深度,即使节点是不同父节点的子节点。

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

      【讨论】:

      • 感谢您的回复。有更好的解决方案吗?我尝试手动设置 zPosition,但 ZPosition 管理很快成为一项乏味的任务。
      • 之所以有效,是因为您需要知道您的场景有多少元素。但是下面的示例有效,在 Playground 中进行了测试。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多