代码之家  ›  专栏  ›  技术社区  ›  Steve Ives

iOS枚举ChildNodeswithName以访问所有物理实体

  •  1
  • Steve Ives  · 技术社区  · 8 年前

    我正在编写一个助手方法来显示iOS上SpriteKit应用程序中所有物理交互(碰撞和接触)的摘要。

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

    在我的助手函数中,我想搜索所有节点,如果它们有physicsBody,则打印它们的类别、碰撞和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 或其某种变体。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Whirlwind    8 年前

    这对我很有效:

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

    关于 // :

    当放置在搜索字符串的开头时,它指定 搜索应该从根节点开始并递归执行 跨整个节点树。

    关于 . :

    指当前节点。

    这也可能适用于您(如果您想在给定矩形内找到所有物理体):

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