2015-07-22 4 views
7

Я всегда думал, что zPosition SKNode будет относительно его родителя, но прямо сейчас я испытываю противоположный эффект.zПоложение SKNode относительно его родителя?

У меня есть два родительских SKNodes в моей сцене, у которых есть zPosition 1 (node1) и 2 (node2). То, что я хочу достичь, - это то, что node2 должен ВСЕГДА быть наложенным слоем ABOVE node1. Но, к сожалению, дочерние узлы node1 (которые имеют zPosition 1-50) все слоируются над дочерними узлами node2 (которые в настоящее время не имеют zPosition). Есть ли способ решить эту проблему (за исключением того, что узел node2 занимает более 50)? Может быть, какой-то логический параметр для установки всех дочерних узлов zPosition относительно его родителя? Любая помощь будет оценена!

EDIT: Для того, чтобы сделать его более ясным, вот иерархия всех элементов:

  • node1: SKNode (zPosition 1)
    • child1: SKNode (zPosition 1)
    • child2: SKNode (zPosition 2)
    • child3: SKNode (zPosition 3)
    • ...
    • child50: SKNode (ЗПО sition 50)
  • узел2: 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 (так как они имеют одинаковое положение z). Все остальные слои расположены под дочерними узлами node1.

+0

Рассматривали ли вы добавление ярлыка в качестве ребенка спрайта? Вам нужно будет установить положение метки в 'CGPointZero', чтобы сделать эту работу. – 0x141E

+0

Спасибо, но я не намерен устанавливать метки в качестве дочернего элемента спрайтов. – biedert

+0

Почему вы хотите, чтобы узлы упорядочивались таким образом? – 0x141E

ответ

11

При чтении Apple Documentation по этому поводу, вы можете найти:

Поддержание порядка детей узла, а может быть много работы. Вместо этого вы можете дать каждому узлу явную высоту в сцене. Вы делаете это, устанавливая свойство zPosition узла. Позиция z - это высота узла относительно его родительского узла, так как свойство позиции узла представляет его положение x и y относительно позиции родителя. Таким образом, вы используете позицию z для размещения узла выше или ниже позиции родителя.

Когда вы Z позиции во внимание, вот как дерево узел визуализации:

  • глобальное положение г каждого узла вычисляется.
  • Узлы рисуются в порядке от наименьшего значения z до наибольшего значения z.
  • Если два узла имеют одно и то же значение z, предки визуализируются первыми, а братья и сестры отображаются в порядке возрастания.

Точка я нашел - что я не знаю, что это было похоже на это - то, что дети zPosition рассчитывается Суммирование их родителей zPosition, так что если node1.zPosition + (node1's)child3.zPosition = 4 и node2.zPosition + (node2's)child3.zPosition = 3, дитя NODE1 будет окрашена выше ,

Решение: node2.zPosition больше, чем (node1's)lastChild.zPosition + node1.zPosition.

+0

Я боюсь, что« именно то, что я сделал », но дочерние узлы узла1 по-прежнему расположены над дочерними узлами узла2. О, и оба узла имеют один и тот же родитель. Чтобы это стало яснее, я добавил иерархию всех элементов в текст описания. – biedert

+0

Если вы правы, вы обнаружили большую ошибку на SpriteKit. Не могли бы вы разместить точный код, где вы добавляете node1 и node2 в один и тот же родитель? И код, в который вы добавляете дочерний узел node1, который появляется за дочерними узлами node2? – aramusss

+0

уверен, я прикрепил его выше – biedert

Смежные вопросы