遍历一个 SKNode 的所有 children?
Loop through all children of an SKNode?
我有一个 SKNode,其中包含 child 个 SKSpriteNode。一个简化的例子:
var parentNode = SKNode()
var childNode1 = SKSpriteNode()
var childNode2 = SKSpriteNode()
self.addChild(parentNode)
parentNode.addChild(childNode1)
parentNode.addChild(childNode2)
我想 运行 对所有这些 child 人执行 colorizeWithColor
操作。当我运行对parentNode
的操作时,没有效果。
我不能在 parent 上使用 enumerateChildNodesWithName
,因为它的许多 children 已经有了我正在使用的名字。
有没有一种方法可以遍历 parentNode
的所有 children,以便 运行 对所有 运行 执行一个操作?
你可以简单地枚举 parentNode.children
:
for child in parentNode.children as! [SKNode] {
// ...
}
如有必要,检查每个 child 是否实际上是 SKSpriteNode
:
for child in parentNode.children {
if let spriteNode = child as? SKSpriteNode {
// ...
}
}
从 Swift 2 (Xcode 7) 开始, 枚举和可选的转换可以与 for-loop 和 case-pattern:
for case let child as SKSpriteNode in parentNode.children {
// ...
}
您可以通过访问父项的 children
属性来获取子项数组,然后遍历它们并在它们上 运行 colorizeWithColor
。
let children = parentNode.children
for child in children {
// Do something.
}
截至 2017 年..
代码确实只是
for case let child as SKSpriteNode in parentNode.children {
// ...
}
但是
性能极差:无法使用。
您必须保留自己的列表。
当然,如果您要创建多个“坦克”或“宇宙飞船”,您自然会将它们保存在一个列表中。如果您需要迭代,这是唯一可行的方法。
我运行一些这样的测试代码...
// 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)")
如果你只是遍历你自己的列表,它会快 3 或 4 倍。
iPad ...
上的典型输出
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
(特别是,如您所料,内置枚举永远占用“第一次”时间。)
考虑到性能,实际上您必须保留自己的精灵列表并使用该列表。
我需要遍历 SCNNode
以查找我创建的自定义 SCNNode
子类。尽管这个问题是针对 SKNNode 的,但答案是我能找到的唯一让我朝着正确方向前进的答案。我不得不对其进行调整,但这是我使用的:
for child in parentNode.childNodes {
if let myCustomNode = child as? MyCustomNode {
// ...
}
}
我有一个 SKNode,其中包含 child 个 SKSpriteNode。一个简化的例子:
var parentNode = SKNode()
var childNode1 = SKSpriteNode()
var childNode2 = SKSpriteNode()
self.addChild(parentNode)
parentNode.addChild(childNode1)
parentNode.addChild(childNode2)
我想 运行 对所有这些 child 人执行 colorizeWithColor
操作。当我运行对parentNode
的操作时,没有效果。
我不能在 parent 上使用 enumerateChildNodesWithName
,因为它的许多 children 已经有了我正在使用的名字。
有没有一种方法可以遍历 parentNode
的所有 children,以便 运行 对所有 运行 执行一个操作?
你可以简单地枚举 parentNode.children
:
for child in parentNode.children as! [SKNode] {
// ...
}
如有必要,检查每个 child 是否实际上是 SKSpriteNode
:
for child in parentNode.children {
if let spriteNode = child as? SKSpriteNode {
// ...
}
}
从 Swift 2 (Xcode 7) 开始, 枚举和可选的转换可以与 for-loop 和 case-pattern:
for case let child as SKSpriteNode in parentNode.children {
// ...
}
您可以通过访问父项的 children
属性来获取子项数组,然后遍历它们并在它们上 运行 colorizeWithColor
。
let children = parentNode.children
for child in children {
// Do something.
}
截至 2017 年..
代码确实只是
for case let child as SKSpriteNode in parentNode.children {
// ...
}
但是
性能极差:无法使用。
您必须保留自己的列表。
当然,如果您要创建多个“坦克”或“宇宙飞船”,您自然会将它们保存在一个列表中。如果您需要迭代,这是唯一可行的方法。
我运行一些这样的测试代码...
// 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)")
如果你只是遍历你自己的列表,它会快 3 或 4 倍。
iPad ...
上的典型输出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
(特别是,如您所料,内置枚举永远占用“第一次”时间。)
考虑到性能,实际上您必须保留自己的精灵列表并使用该列表。
我需要遍历 SCNNode
以查找我创建的自定义 SCNNode
子类。尽管这个问题是针对 SKNNode
for child in parentNode.childNodes {
if let myCustomNode = child as? MyCustomNode {
// ...
}
}