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:如何遍历节点的祖先?的主要内容,如果未能解决你的问题,请参考以下文章