循环遍历SKNode的所有孩子?

时间:2015-01-10 20:32:52

标签: ios swift sprite-kit

我有一个带有多个子SKSpriteNodes的SKNode。一个简化的例子:

var parentNode = SKNode()
var childNode1 = SKSpriteNode()
var childNode2 = SKSpriteNode()

self.addChild(parentNode)
parentNode.addChild(childNode1)
parentNode.addChild(childNode2)

我想对所有这些孩子进行colorizeWithColor行动。当我在parentNode上执行操作时,没有效果。

我不能在父母身上使用enumerateChildNodesWithName,因为它的许多孩子已经拥有我正在使用的名字。

是否有办法循环遍历parentNode的所有孩子,以便对所有这些孩子进行单一操作?

4 个答案:

答案 0 :(得分:17)

您可以简单地枚举parentNode.children

for child in parentNode.children as! [SKNode] {
    // ...
}

如有必要,请检查每个孩子是否实际为SKSpriteNode

for child in parentNode.children {
    if let spriteNode = child as? SKSpriteNode {
        // ...
    }
}

Swift 2(Xcode 7)开始,枚举和可选的强制转换可以与带有案例模式的for循环结合使用:

for case let child as SKSpriteNode in parentNode.children {
    // ...
}

答案 1 :(得分:2)

截至2017年..

代码确实只是

    // try Apple's native .children call...

    for case let s as SomeSpriteClass in children { k += 1 }
    let t1 = a.microseconds()

    // simply use your own list...

    let b = Date()
    for s in spaceships { k += 1 }
    let t2 = b.microseconds()

    print("\(t1) \(t2)")

但是

性能非常糟糕:它无法使用。

您必须保留自己的列表。

当然,如果你要创造一些"坦克"或"宇宙飞船"无论如何,你自然会将这些列入清单。如果你需要迭代,它是唯一可行的方法。

我运行了一些像这样的测试代码......

939 43
140 33
127 33
117 37
109 30
126 33
127 33
109 29
96 30
96 29
99 30
97 30
97 30
如果你只是迭代你自己的列表,它会快3到4倍。

iPad上的典型输出......

Context.Request

(特别是,正如您所期望的那样,内置枚举永远需要"第一次"时间。)

考虑到性能,在实践中有必要保留自己的精灵列表并将其运行。

答案 2 :(得分:1)

您可以通过访问父级children - 属性来获取子级数组,然后循环遍历它们并在其上运行colorizeWithColor

let children = parentNode.children
for child in children {
    // Do something.
}

答案 3 :(得分:0)

我需要遍历SCNNode来查找我创建的自定义SCNNode子类。即使这个问题是针对SKNNode @MartinR's的,答案也是我发现的唯一答案,这使我朝着正确的方向前进。我必须对其进行调整,但这是我所使用的:

for child in parentNode.childNodes {

    if let myCustomNode = child as? MyCustomNode {
        // ...
    }                        
}