使用Swift在SpriteKit中复制()节点

时间:2017-04-09 10:13:53

标签: ios swift sprite-kit

我在Swift

中使用copy()的节点制作了副本

例如:

var copy = original.copy() as! SKSpriteNode) 

这很好用。

我的问题是,当我想删除原始节点(使用removeFromParent)时,我还想自动删除复制节点。

我该怎么做?我制作了一个2D太空射击游戏(像Defender),我在Radarcam中使用了复制节点。

感谢。

2 个答案:

答案 0 :(得分:1)

非常简单的解决方案,使节点成为父节点和副本的父节点,然后在不再需要时删除父节点。

答案 1 :(得分:0)

您可以定义这样的类来跟踪节点之间的链接(如 Paulw11 所示)。

final class LinkedNodes {

    static let shared = LinkedNodes()
    private var links: [(SKNode, SKNode)] = []

    private init() { }

    func link(nodeA: SKNode, to nodeB: SKNode) {
        let pair = (nodeA, nodeB)
        links.append(pair)
    }

    func removeNodesLinked(to node: SKNode) {
        let linkedNodes = links.reduce(Set<SKNode>()) { (res, pair) -> Set<SKNode> in
            var res = res
            if pair.0 == node {
                res.insert(pair.1)
            }
            if pair.1 == node {
                res.insert(pair.0)
            }
            return res
        }
        linkedNodes.forEach { $0.removeFromParent() }
        links = links.filter { $0.0 != node && $0.1 != node }
    }
}

复制节点

现在只需记住在复制节点时创建链接

let copy = original.copy() as! SKSpriteNode)
LinkedNodes.shared.link(nodeA: original, to: copy)

删除节点

现在您可以删除写入

的给定节点的所有链接节点
LinkedNodes.shared.removeNodesLinked(to: original)