0

目的: 完了ハンドラーを待っている間に、ループを使用して複数のノードに 1 つの SKAction アニメーションを適用します。

    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% に到達しましたが、これを行うためのより良い方法があると直感的に教えてくれました。最後のノードのアニメーションがいつ終了したかを知るにはどうすればよいですか?

4

1 に答える 1

1

どちらのシーケンスも 3 秒間実行されるため、最初の完了ブロックが実行されたときに、すべてが完了したと安全に想定できます。100% 確実にするには、完了ハンドラーで bool ivar を設定しdidEvaluateActions、シーンのメソッドでポストシーケンス コードを実行します。

または、実行するシーケンスの数をカウントしてから、完了ブロックのカウンターを増やし、両方のカウンターが一致したときにコードを実行します。

于 2014-11-16T09:09:30.310 に答える