SKLabelNode序列动画,中间有不必要的延迟

时间:2015-01-22 08:43:05

标签: swift sprite-kit skaction sklabelnode

我有SKLabelNode表示当前得分,我试图通过增长和缩小序列动画,只要得分值达到某个特定数字(例如10,20,......)。问题是动画本身在两者之间存在某种延迟,并且比我设定的持续时间花费的时间要多得多。基本上它会增长,然后等待,然后在最终收缩之后。

这是我的代码:

override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        ...
        //skactions setting
        growAction = SKAction.scaleBy(1.2, duration: 0.4)
        shrinkAction = SKAction.scaleBy(0.8333, duration: 0.4)
        growAndShrink = SKAction.sequence([growAction, shrinkAction])
        ...
}


override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */

        if (score % 10) == 0 && score != 0 && gameState == GameState.Play {
            scoreLabel.runAction(growAndShrink)
        }       
}

我虽然更新func是正确的用途,或者是它?

2 个答案:

答案 0 :(得分:1)

您可以在此处使用completion:参数来调用检查操作是否应该重新运行的函数,例如

scoreLabel.runAction(growAndShrink, completion: { self.runAgain() })
然后

runAgain将包含用于检查和重新运行操作的逻辑。基本上你可以把两者结合起来:

func runGrowAndShrinkAction()
{
    if (conditions)
    {
        scoreLabel.runAction(growAndShrink, completion: { self.runGrowAndShrinkAction() })
    }
}

旁注:如果您在序列中使用runBlock,请考虑它是异步调用的。也就是说,completion:的执行不会等待runBlock完成。

更新:其他选项是使用SKAction.repeatActionForever(),如果update方法中的条件发生变化,您可以使用removeActionForKey()删除操作。

答案 1 :(得分:1)

您可以在分数上创建didSet property observer以动态更新分数标签并执行动画。

var score : Int = 0 {
    didSet
    {
        scoreLabel.text = "Score : \(score)"

        if (score % 10 == 0 && score != 0 && gameState == GameState.Play)
        {
            animateScore()
        }
    }
}

func animateScore()
{
    scoreLabel.removeAllActions()
    scoreLabel.text = "Score : \(score)"
    let growAction = SKAction.scaleBy(1.2, duration: 0.4)
    let shrinkAction = SKAction.scaleBy(0.8333, duration: 0.4)
    let growAndShrink = SKAction.sequence([growAction, shrinkAction])
    scoreLabel.runAction(SKAction.repeatAction(growAndShrink, count: 2))
}