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)
        }       
}

我虽然更新函数是正确的,还是吗?

您可以在此处使用 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()删除该操作。

您可以创建乐谱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))
}

最新更新