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

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

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

【问题讨论】:

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

标签: ios sprite-kit skspritenode sknode


【解决方案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 希望针对特定的祖先
猜你喜欢
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 2015-08-17
相关资源
最近更新 更多