This question显示了如何查找属于某个类的SKNode的所有子级,但是如果我们希望所有属于某个类的后代(例如孙子级)怎么办?

有没有在SpriteKit中执行此操作的本地方法,还是从上述问题创建递归形式的解决方案的唯一选择?

SKNode文档着重介绍了一种搜索功能,该功能可让您查找具有特定名称的后代,但是是否可以通过类而不是名称来过滤后代?如果可以避免,我们不想为节点分配名称。

我们正在使用Swift 3。

最佳答案

只需将此扩展添加到您的项目中

import SpriteKit

extension SKNode {
    func allDescendants<Element: SKNode>(byType type: Element.Type) -> [Element] {
        let currentLevel:[Element] = children.flatMap { $0 as? Element }
        let moreLevels:[Element] = children.reduce([Element]()) { $0 + $1.allDescendants(byType: type) }
        return currentLevel + moreLevels
    }
}

现在,您可以获取具有特定类型(例如SKNode)的SKSpriteNode的所有后代
let descendants = node.allDescendants(byType: SKSpriteNode.self)

例子
class Enemy: SKSpriteNode { }

let root = SKNode()
let a = Enemy()
let b = SKNode()
let c = SKNode()
let d = Enemy()

root.addChild(a)
root.addChild(b)
a.addChild(c)
a.addChild(d)

let enemies: [Enemy] = root.allDescendants(byType: Enemy.self)

print(enemies.count) // 2

关于ios - SpriteKit : find all descendants of SKNode of certain class?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44274220/

10-09 09:37