SpriteKit:找到某类SKNode的所有后代?

时间:2017-05-31 01:24:36

标签: ios swift sprite-kit sknode

This question显示如何查找属于某个类的SKNode的所有子项,但是如果我们想要所有后代(例如孙子)属于某个类呢?

在SpriteKit中是否有以本机方式执行此操作,或者是从上述问题创建解决方案的递归形式的唯一选项?

SKNode文档突出显示了一个搜索功能,可以让您找到具有特定名称的后代,但有没有办法按类过滤后代而不是名称?如果可以避免,我们不想为节点分配名称。

我们正在使用Swift 3。

2 个答案:

答案 0 :(得分:2)

我们所做的是将一个块传递给按名称查找节点的SKNode函数,并使用*作为搜索项,以避免为所需节点指定名称。

    var descendants = [CustomClass]()
    nodeToSearch.enumerateChildNodes(withName: ".//*") { node, stop in
        if node is CustomClass {
            descendants.append(node as! CustomClass)
        }
    }

答案 1 :(得分:1)

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

即可
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