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()
}
您好!在这里问的第一个问题!
我有一个包含各种角色和声音的 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()
}