正确检测同时SKActions的完成情况

时间:2015-06-26 13:48:57

标签: swift sprite-kit skaction swift2

我对iOS上的原生编程很新。我的游戏场景中有一个函数可以移动SKSpriteNodes数组。每次移动完成后,应从场景中删除其节点。该函数还具有完成功能,应该在删除所有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)
}

1 个答案:

答案 0 :(得分:1)

添加一个变量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()
            }
        })
    }
}

我没有编译或运行它,因此可能存在错误,但这应该有效