问题描述
你好!在这里问过的第一个问题!
我有一个包含各种角色和声音的 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 一起使用——但这似乎不起作用?
我在这里很绿色,但我猜测一种基于音频文件长度的完成处理程序?
请帮忙。
谢谢!
小卡尔带给您的
解决方法
您使用repeatForever 和removeAllActions 是正确的,但需要进行一些修改。
修改你的animateAction,你想使用repeatForever而不是手动计数,所以改变这个:
Nothing
为此:
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,restore: true))
您的 soundAction 需要将 waitForCompletion 设置为 true,根据文档:如果为 true,则持续时间此动作的长度与音频播放的长度相同。如果为 false,则认为该操作已立即完成。 您会注意到声音和动画同时运行,即使您放置了 SKAction.sequence。
您的声音动作应如下所示:
character.run(animateAction)
因为您的等待完成现在为真,我们可以运行音频,然后在音频完成后删除操作,如下所示:
let soundAction = SKAction.playSoundFileNamed("sound",waitForCompletion: true)
总结
这是最终代码:
character.run(soundAction) { [self] in
character.removeAllActions()
}