根据名称定位多个精灵?

时间:2016-01-01 23:06:20

标签: swift sprite-kit

这段代码的问题在于它只针对名为“coin”的1个SKNode,我想要定位所有名为“coin”的SKNode。我不知道怎么做......

继承我所拥有的:

func killCoins(){
    let skcoin: SKNode = self.childNodeWithName("coin")!
    // Looks for a SKNode named "coin".
    let coinsprite: SKSpriteNode = (skcoin as? SKSpriteNode)!
    // Converts the SKNode into a SKSpriteNode
    coinsprite.removeFromParent()
    // Kills Sprite
}

3 个答案:

答案 0 :(得分:3)

要移除多个SKSpriteNode,请遍历所有子项并删除名为SKSpriteNode的{​​{1}}个。

"coin"

答案 1 :(得分:0)

作为vacawama答案的补充,您可以enumerateChildNodesWithName:usingBlock:使用more advanced searches

self.enumerateChildNodesWithName("coin") {
    node, stop in 
    // do something with node or stop
}

来自文档:

  

此方法按顺序枚举子数组,搜索节点   其名称与搜索参数匹配。该块被调用一次   与name参数匹配的每个节点。

答案 2 :(得分:0)

解决方案1 ​​

您可以查找名称为SKSpriteNode(s)的所有孩子coin。以下代码完全是面向功能编程的

func killCoins() {
    self
        .children
        .filter { $0 is SKSpriteNode && $0.name == "coin" }
        .forEach { $0.removeFromParent() }
}

此操作的时间为O(n),其中n是当前节点/场景的子项总数。 我们可以做得更好。

解决方案2

只需创建一个特殊节点,该节点将成为所有硬币的父节点

override func didMoveToView(view: SKView) {
    let coins = SKNode()
    coins.name = "coins"
    self.addChild(coins)

    let coin0 = SKSpriteNode(imageNamed: "coin")
    coins.addChild(coin0)

    let coin1 = SKSpriteNode(imageNamed: "coin")
    coins.addChild(coin1)
}

现在killCoins变为

func killCoins() {
    self.childNodeWithName("coins")?.removeAllChildren()
}

此操作的时间复杂度为O(m),其中m是硬币的数量。