手动获取SpriteKit兄弟顺序

时间:2015-12-05 08:52:58

标签: ios sprite-kit

在SpriteKit中,如果某些节点共享相同的zPosition,则按照添加到场景中的顺序呈现节点,以便添加的最新节点将位于其他节点之上(只要ignoresSiblingOrder场景属性设置为false)

我想知道是否有办法知道SpriteKit将呈现共享相同zPosition的节点的顺序,以便我可以给出一个明确的zPosition。

谢谢。

1 个答案:

答案 0 :(得分:2)

前提

当您将子项添加到actionArray = [SKAction]() 时,它会添加到actionArray.append(sKAction) 数组属性的末尾。 (至少我发现运行了一些测试)。

解决方案

因此,您可以滚动给定节点的所有子节点并按SKNode对它们进行分组。您将获得一个字典,其中childrenzPosition,而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)