2016-04-06 93 views
1

我正在写一个帮助器方法来显示iOS上的SpriteKit应用程序中的所有物理交互(碰撞和联系人)的摘要。iOS enumerateChildNodeswithName访问所有物理实体

我有一个简单的场景,与边界(由self.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame))和3种简单的形状(2个正方形和圆形)至极通过addChild()

被添加到场景在我的帮助功能,我想搜索所有节点,如果他们有一个physicsBody,打印他们的类别,collision和contactTest位掩码。

如果我的代码如下:

enumerateChildNodesWithNeme("*") { node, _ in { 
    print("Node: \(node.name)") 
} 

然后我只得到了3个形状上市:未返回

Node: Optional("shape_blueSquare") 
Node: Optional("shape_redCircle") 
Node: Optional("shape_purpleSquare") 

我的场景的physicsBody。但是,如果使用:

enumerateChildNodesWithNeme("..") { node, _ in { 
    print("Node: \(node.name)") 
} 

然后我得到:

Node: Optional("shape_edge") 

如果我使用:

enumerateChildNodesWithNeme("..//") { node, _ in { 
    print("Node: \(node.name)") 
} 

我什么也没得到,而我认为这将拉升节点树的场景,然后递归地返回所有的孩子。搜索参数"//*"也只返回3个孩子。

所有的时间,skView.showNodecount = true显示的节点数是4

所以我的问题是:是否有一个enumerateChildNodesWithName的搜索参数将返回一个场景中的所有节点(包括场景本身),或者我误解了场景和它的孩子之间的关系,因为单个搜索不能同时搜索?它可能是后者,因为print("\(parent.children)")返回nil,当我期待看到self或这样的一些变化。

+0

如果是这样的方式,它的作品,我的代码,会发现所有除了场景的物理体之外的其他物理机构,那很好 - 我可以单独处理。我只是想确保我不会错过任何其他的东西。 –

+1

打印类似于print(“\(parent.children)”)的结果总是以nil结尾。我假设在这里,隐式自我是一个'GameScene'或类似的东西。你得到零,因为([根据文档](https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/)),场景是一个根节点,所以它可以'没有父母。例如,你不能从父窗口中删除场景(当self是当前场景时,'self.parent'属性总是'nil'),因此'self.removeFromParent()'没有效果。 – Whirlwind

+0

@Whirlwind - 有道理 - 谢谢。 –

回答

2

这为我工作:

enumerateChildNodesWithName("//.") { (node, _) -> Void in 
    print("Node: \(node.name)") 
} 

关于//

当放置在搜索字符串的开始时,这指明了 搜索应该在根节点开始和进行跨整个节点树递归地 。

关于.

指当前节点。

而且这可能会为你工作,以及(如果你想找到一个给定的矩形内的所有物理机构):

self.physicsWorld.enumerateBodiesInRect(frame) { (body, _) -> Void in 
    print(body.node?.name) 
} 
+0

刚刚在火车之家试过,它工作 - 非常感谢。不相信//和的描述。尽管如此,运营商在这种情况下是合乎逻辑的 –