我一直认为SKNode的zPosition是相对于它的父级的,但是现在我正在经历相反的效果.
我的场景中有两个父SKNode,其zPosition为1(node1)和2(node2).我想要实现的是node2应该总是分层ABOVE node1.但不幸的是,node1的子节点(其zPosition为1-50)都位于node2的子节点之上(当前没有zPosition).有没有办法解决这个问题(除了给node2一个超过50的zPosition)?也许是某种布尔参数来设置所有子节点的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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行它时,您可以看到只有node2(label1)的第一个子节点位于node1的第一个子节点之上(因为它们具有相同的zPosition).所有其他的都在node1的子节点下面.
ara*_*sss 12
阅读Apple文档时,您可以找到:
维护节点的子节点的顺序可能很多.相反,您可以在场景中为每个节点指定一个显式高度.您可以通过设置节点的zPosition属性来完成此操作.z位置是节点相对于其父节点的高度,就像节点的position属性表示相对于父节点的x和y位置一样.因此,您使用z位置将节点放置在父节点的上方或下方.
考虑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.
| 归档时间: |
|
| 查看次数: |
2950 次 |
| 最近记录: |