我一直认为 SKNode 的 zPosition 是相对于其父节点的,但现在我遇到了相反的效果。
我的场景中有两个父 SKNode,它们的 zPosition 分别为 1(节点 1)和 2(节点 2)。我想要实现的是,node2 应该始终位于 node1 之上。但不幸的是,node1 的子节点(zPosition 为 1-50)都位于 node2 的子节点(当前没有 zPosition)之上。有没有办法解决这个问题(除了给node2一个超过50的zPosition)?也许某种布尔参数来设置所有子节点相对于其父节点的 zPosition?任何帮助将不胜感激!
编辑:为了更清楚,这里是所有元素的层次结构:
- node1:SKNode (zPosition 1)
- child1:SKNode(z位置1)
- child2:SKNode(z位置2)
- child3:SKNode(z位置3)
- ...
- child50:SKNode(z位置 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(标签1)的第一个子节点位于node1的第一个子节点之上(因为它们具有相同的zPosition)。所有其他节点都位于 node1 的子节点下方。
阅读时苹果文档 https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Nodes/Nodes.html关于这一点,你可以找到:
维护节点子节点的顺序可能需要大量工作。相反,您可以为场景中的每个节点指定一个明确的高度。您可以通过设置节点的 zPosition 属性来完成此操作。 z 位置是节点相对于其父节点的高度,就像节点的位置属性表示其相对于父节点位置的 x 和 y 位置一样。因此,您可以使用 z 位置将节点放置在父级位置的上方或下方。
当考虑 z 位置时,节点树如下所示
呈现:
- 计算每个节点的全局 z 位置。
- 节点按从最小 z 值到最大 z 值的顺序绘制。
- 如果两个节点共享相同的 z 值,则先渲染祖先节点,然后按子节点顺序渲染兄弟节点。
我发现的一点 - 我不知道是这样的 - 孩子的 zPosition 是通过对他们的父母 zPosition 求和计算得出的,所以如果node1.zPosition + (node1's)child3.zPosition = 4
, and node2.zPosition + (node2's)child3.zPosition = 3
,node1 的子节点将被绘制在上面。
解决方案:设置node2.zPosition
大于(node1's)lastChild.zPosition + node1.zPosition
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)