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

我想知道是否有一种方法可以知道SpriteKit将渲染共享相同zPosition的节点的顺序,以便我可以给它一个明确的zPosition。

谢谢。

最佳答案

前提

将子级添加到SKNode时,它会添加到children数组属性的末尾。 (至少这是我发现的一些测试结果)。



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

10-12 05:33