1

我有代表当前分数的 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)
        }       
}

我虽然 update func 是正确的,或者是吗?

4

2 回答 2

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().

于 2015-01-22T09:08:33.413 回答
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))
}
于 2015-01-22T11:49:53.353 回答