我有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是正确的用途,或者是它?
答案 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))
}