SpriteKit:如何遍历节点的祖先?

Posted

技术标签:

【中文标题】SpriteKit:如何遍历节点的祖先?【英文标题】:SpriteKit: how to iterate through ancestors of a node? 【发布时间】:2017-04-18 07:08:45 【问题描述】:

我们想要遍历节点的祖先,直到找到具有特定类的父节点。

SpriteKit 允许您使用 children 属性遍历子级,但 parent 属性仅包含直接父级——而不是父级数组。我们如何遍历一个节点的所有祖先?

【问题讨论】:

我很确定使用 childNodeWithName 可以在两个方向上获得节点,您只需要使用 / 让它从根节点开始,并不能完全让您成为父节点,但它可能如果孩子知道爷爷的名字,请帮忙 @Knight0fDragon 有趣的想法。为什么不发布作为答案让更多人看到呢?如果您尝试过并且知道它有效,我可以将其标记为答案。 不是你的问题的答案,它更像是一种不同的策略 【参考方案1】:

我不知道有一个函数可以让您向上层级,类似于 enumerateChildNodes 函数允许您向下层级。也许这个递归函数可能会有所帮助。下面我将递归设置为在没有父级或父级是 SKScene 类时结束。您可能需要对其进行调整,以便在找到您的特定类时结束递归。

func parentNodesOf(_ node: SKNode) -> [SKNode]

    if let parentNode = node.parent
    
        if parentNode is SKScene
        
            return []
        
        else
        
            return [parentNode] + parentNodesOf(parentNode)
        
    
    else
    
        return []
    

希望这会有所帮助!

【讨论】:

如果放在 SKNode 类的扩展中(例如,父母属性),这可能会更有用。 是的。您可能希望这是 SKNode 的扩展,而不是松散的常设功能。【参考方案2】:

JohnV 答案的替代方案

extension SKNode 
    func forEachAncestor(_ closure: (_ ancestor: SKNode) -> Void) 
        var currentParent: SKNode? = self.parent
        while currentParent != nil 
            closure(currentParent!)
            currentParent = currentParent!.parent
        
    

【讨论】:

不是 100% 的答案,您正在对所有祖先运行闭包,而 OP 希望针对特定的祖先

以上是关于SpriteKit:如何遍历节点的祖先?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SpriteKit 和内置物理引擎移动和跳跃精灵

树递归遍历————二叉搜索树的最近公共祖先

习题整理,二叉树后续遍历得到指定节点到其祖先的路径

如何在任何二叉树中找到两个节点的最低共同祖先?

236. 二叉树的最近公共祖先-中序遍历-中等难度

LeetCode二叉树#16二叉树的最近公共祖先(递归后序遍历,巩固回溯机制)