正确检测同步 SKActions 的完成

Properly detect completion of simultaneous SKActions

我对 iOS 上的本机编程还很陌生。我的游戏场景中有一个函数可以移动 SKSpriteNode 数组。每次移动完成后,应将其节点从场景中移除。该函数还有一个完成函数,应该在删除所有 SKNode 后调用。我的问题是,是否有一种更简洁的方法可以在 moveAction 的持续时间内增加一点额外的时间,直到调用完成函数(见下文)。我也玩过动作序列,但无法想出一个可行的解决方案...

我们将不胜感激!

func animateNodes(nodes: Array<SKSpriteNode>, completion:() -> ()) {
    let duration = NSTimeInterval(0.5)
    for (_, node) in nodes.enumerate() {
        let point = CGPointMake(node.position.x - 80, node.position.y + 80)
        let moveAction = SKAction.moveTo(point, duration: duration)
        let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration)
        node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: {
            node.removeFromParent()
        })
    }
    runAction(SKAction.waitForDuration(duration + 0.1), completion:completion)
}

添加一个变量 count 来跟踪当前有多少节点处于活动状态。在每个节点的完成中,减少计数并检查它是否是最后一个 (count == 0) 和 运行 完成操作,如果它是:

func animateNodes(nodes: Array<SKSpriteNode>, completion:() -> ()) {
    var count = nodes.count
    let duration = NSTimeInterval(0.5)
    for (_, node) in nodes.enumerate() {
        let point = CGPointMake(node.position.x - 80, node.position.y + 80)
        let moveAction = SKAction.moveTo(point, duration: duration)
        let fadeOutAction = SKAction.fadeAlphaTo(0, duration: duration)
        node.runAction(SKAction.group([moveAction, fadeOutAction]), completion: {
            node.removeFromParent()
            count--
            if count == 0 {
                completion()
            }
        })
    }
}

我还没有编译或运行这个,所以可能会有错误,但这应该可以