Sprite Kit 动画为各种声音文件计时 - 目标:动画在每个声音文件结束时自动结束,以避免手动为每个声音文件计时

Sprite Kit Animation timed to various sound files - GOAL: animation auto ends at end of each sound file to avoid manually timing each one

您好!在这里问的第一个问题!

我有一个包含各种角色和声音的 SpriteKit 项目。

角色会根据场景制作出各种不同声音的动画。

我正在尝试找到一种方法,让动画在声音文件播放完毕时结束。目前我正在使用以下设置,其中涉及手动计算每个场景的计数。

func animateCharacter() {
       
        let soundAction = SKAction.playSoundFileNamed("sound", waitForCompletion: false)
        let animateAction = SKAction.repeat(SKAction.animate(with: animatedFrames, timePerFrame: 0.1, resize: false, restore: true), count: 3)
        
        character.run(SKAction.sequence([soundAction,animateAction]))
        
        }

有什么方法可以自动执行此操作,以便每个动画在每个声音文件的长度内重复播放?

我试过将 repeatForever 与 removeAllActions 一起使用 - 但似乎不起作用?

我很新手,但我猜是一种基于音频文件长度的完成处理程序?

请帮忙。

谢谢!

Carl's Jr. 带给您

您使用 repeatForever 和 removeAllActions 是正确的,但需要进行一些修改。

修改你的animateAction,你想使用repeatForever而不是手动计数,所以改变这个:

let animateAction = SKAction.repeat(SKAction.animate(with: animatedFrames, timePerFrame: 0.1, resize: false, restore: true), count: 3)

为此:

let animateAction = SKAction.repeatForever(SKAction.animate(with: animatedFrames, timePerFrame: 0.1, resize: false, restore: true))

此时您还可以 运行 您的动画动作,因此将其添加到其下方的行中:

character.run(animateAction)

您的 soundAction 需要根据文档将 waitForCompletion 设置为 true如果为真,则此操作的持续时间与音频播放的长度相同。如果为 false,则认为该操作已立即完成。 您会注意到您的声音和动画同时 运行,即使您将 SKAction.sequence.

你的声音动作应该是这样的:

let soundAction = SKAction.playSoundFileNamed("sound", waitForCompletion: true)

因为您等待完成现在为真,我们可以 运行 音频然后在音频完成后删除操作,如下所示:

  character.run(soundAction) { [self] in
    character.removeAllActions()
  }

摘要

这是最终代码:

  let animateAction = SKAction.repeatForever(SKAction.animate(with: animatedFrames, timePerFrame: 0.1, resize: false, restore: true))
  character.run(animateAction)
  
  let soundAction = SKAction.playSoundFileNamed("sound", waitForCompletion: true)
  character.run(soundAction) { [self] in
      character.removeAllActions()
  }