在SpriteKit中,如果某些节点共享相同的zPosition
,则按照添加到场景中的顺序渲染这些节点,以便最新添加的节点将位于其他节点的顶部(只要ignoresSiblingOrder
场景)属性设置为false)。
我想知道是否有一种方法可以知道SpriteKit将渲染共享相同zPosition
的节点的顺序,以便我可以给它一个明确的zPosition。
谢谢。
最佳答案
前提
将子级添加到SKNode
时,它会添加到children
数组属性的末尾。 (至少这是我发现的一些测试结果)。
解
因此,您可以滚动给定节点的所有子项,并按zPosition
对其进行分组。您将获得一个字典,其中key
是zPosition
,而value
是节点的有序列表(从最早的插入到最新的插入)。
延期
extension SKNode {
func childrenByZPosition() -> [CGFloat:[SKNode]] {
return children.reduce([CGFloat:[SKNode]]()) { (var accumulator, node) -> [CGFloat:[SKNode]] in
var list = accumulator[node.zPosition] ?? [SKNode]()
list.append(node)
accumulator[node.zPosition] = list
return accumulator
}
}
}
测试
class Foo: SKNode {
let num: Int
init(num: Int) {
self.num = num
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var description: String { return num.description }
}
let scene = SKScene()
let node0 = Foo(num: 0)
node0.zPosition = 1
let node1 = Foo(num: 1)
let node2 = Foo(num: 2)
node2.zPosition = 1
let node3 = Foo(num: 3)
let node4 = Foo(num: 4)
scene.addChild(node0)
scene.addChild(node1)
scene.addChild(node2)
scene.addChild(node3)
scene.addChild(node4)
现在,您可以按
zPosition
将孩子分组let dict = scene.childrenByZPosition()
dict[0] // [1, 3, 4]
dict[1] // [0, 2]
关于ios - 手动获取SpriteKit同级订单,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34103028/