使用带完成处理程序的循环在多个节点上单个SKAction动画

时间:2014-11-16 05:07:06

标签: ios objective-c swift sprite-kit completionhandler

目标:使用循环在几个节点上应用单个SKAction Animation,同时等待完成处理程序。

    func animateShuffle(cards: [Card], completionHandler:(success: Bool) -> Void) {
    var rotationInRadians:CGFloat = CGFloat(M_PI)
    var rotateFirstDeck = SKAction.rotateByAngle(rotationInRadians, duration: 1.0)
    var moveFirstDeck = SKAction.moveToX(-150, duration: 1.0)
    var returnToOrigPosition = SKAction.moveToX(-125, duration: 1.0)
    var firstDeckSequence = SKAction.sequence([moveFirstDeck, rotateFirstDeck, returnToOrigPosition])
    var rotateSecondDeck = SKAction.rotateByAngle(-rotationInRadians, duration: 1.0)
    var moveSecondDeck = SKAction.moveToX(-100, duration: 1.0)
    var secondDeckSequence = SKAction.sequence([moveSecondDeck, rotateSecondDeck, returnToOrigPosition])


    for (index, Card) in enumerate(cards){

        if index % 2 == 0{
            Card.image.runAction(firstDeckSequence)
        }
        else{
            Card.image.runAction(secondDeckSequence)
        }
    }

    //hack
    cards[0].image.runAction(firstDeckSequence, completion: { () -> Void in
        completionHandler(success: true)
    })

}

在这里,我调用了启动另一个动画的功能:

animateShuffle(newDeck.deck, completionHandler: { (success) -> Void in
        print("entered")
        var drawnCards = [Card]()
        if let areThereCards = newDeck.drawCards(4){
            drawnCards = areThereCards
        }
        self.dealCards(drawnCards)
    })

我使用黑客来达到我想要的99%,但我的直觉告诉我有更好的方法来做到这一点。如何判断最后一个节点何时完成动画制作?

1 个答案:

答案 0 :(得分:1)

两个序列都运行3秒钟,因此当第一个完成块运行时,您可以安全地假设它们都已完成。要100%确定在完成处理程序中设置bool ivar,然后在场景的didEvaluateActions方法中运行序列后代码。

或者计算你运行的序列数,然后在完成块中增加一个计数器,并在两个计数器匹配时运行你的代码。