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

问题描述

你好!在这里问过的第一个问题!

我有一个包含各种角色和声音的 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()
  }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...