使用带有完成处理程序的循环在多个节点上执行单个 SKAction 动画
Posted
技术标签:
【中文标题】使用带有完成处理程序的循环在多个节点上执行单个 SKAction 动画【英文标题】:Single SKAction Animation on several nodes using a loop with completion handler 【发布时间】:2014-11-16 05:07:06 【问题描述】:目标:使用循环在多个节点上应用单个 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)
)
我使用 hack 达到了我想达到的 99%,但我的直觉告诉我有更好的方法来做到这一点。如何判断最后一个节点何时完成动画?
【问题讨论】:
【参考方案1】:两个序列都运行 3 秒,因此当第一个完成块运行时,您可以放心地假设它们都已完成。为了 100% 确定在完成处理程序中设置一个 bool ivar,然后在场景的 didEvaluateActions
方法中运行您的后序列代码。
或者计算您运行的序列数,然后在完成块中增加一个计数器,并在两个计数器匹配时运行您的代码。
【讨论】:
以上是关于使用带有完成处理程序的循环在多个节点上执行单个 SKAction 动画的主要内容,如果未能解决你的问题,请参考以下文章
在python中的单个列表上使用多个变量(for循环)[重复]