AVAudioPlayer 播放时游戏滞后

2024-03-08

我正在创建一个游戏,用户用喷气背包控制角色。当喷气背包与钻石相交时,我将钻石添加到它们的总数中,然后播放声音。然而,声音会使游戏暂停十分之一秒左右并扰乱流程。这是我正在使用的代码:

var diamondSound = NSBundle.mainBundle().URLForResource("diamondCollect", withExtension: "wav")!
var diamondPlayer = AVAudioPlayer?()

    class GameScene: SKScene{

      override func didMoveToView(view: SKView) {

            do {
                 diamondPlayer = try AVAudioPlayer(contentsOfURL: diamondSound)
                 guard let player = diamondPlayer else { return }

                 player.prepareToPlay()
            } catch let error as NSError {
                 print(error.description)
            }
       }

然后后来:

    override func update(currentTime: CFTimeInterval) {

        if character.intersectsNode(diamond){
            diamondPlayer?.play()
            addDiamond()
            diamond.removeFromParent()
        }

    }

如果这很重要的话,我也正在使用 Sprite Kit。任何帮助是极大的赞赏!


通常,我更喜欢使用SKAction.playSoundWithFile在我的游戏中,但这一个有一个限制,没有音量设置。 因此,通过这个扩展,您可以解决这个缺陷:

public extension SKAction {
  public class func playSoundFileNamed(fileName: String, atVolume: Float, waitForCompletion: Bool) -> SKAction {

    let nameOnly = (fileName as NSString).stringByDeletingPathExtension
    let fileExt  = (fileName as NSString).pathExtension

    let soundPath = NSBundle.mainBundle().URLForResource(nameOnly, withExtension: fileExt)


    var player: AVAudioPlayer! = AVAudioPlayer()
    do { player = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil) }
    catch let error as NSError { print(error.description) }

    player.volume = atVolume

    let playAction: SKAction = SKAction.runBlock { () -> Void in
        player.prepareToPlay()
        player.play()
    }

    if(waitForCompletion){
        let waitAction = SKAction.waitForDuration(player.duration)
        let groupAction: SKAction = SKAction.group([playAction, waitAction])
        return groupAction
    }

    return playAction
  }
}

Usage:

self.runAction(SKAction.playSoundFileNamed("diamondCollect.wav", atVolume:0.5, waitForCompletion: true))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVAudioPlayer 播放时游戏滞后 的相关文章

随机推荐

  • 有没有办法从java调用imagej宏(.ijm)(即将宏存储为字符串并使用imagej的java控件执行它)?

    将问题反转为 如何从 ImageJ 宏调用 执行 java 程序 每当我写 imagej 时 我都会提到斐济 当然 一个简单的解决方案是从 java 字符串创建 ijm 并使用以 ijm 作为参数的系统调用来调用 imagej 但我正在寻找
  • Supervisord celery 的用户不正确

    我有一些使用 celery 运行的定期任务 由supervisord 守护 但是在尝试为我为supervisord 进程设置的用户的主目录中创建一个目录后 我收到了 权限被拒绝 错误 看完之后os environ在运行芹菜任务中的字典我注意
  • 打开 PDF:WPF

    我想通过单击按钮打开 PDF 文件 我会将 PDF 文件保留在项目的解决方案 命名空间中 谁能给我解决这个问题吗 要启动标准 PDF 查看器 您只需启动一个外部进程即可 Process proc new Process proc Start
  • 控制ipython历史长度

    标题几乎说出了我想要的 我想在我的 ipython history 中有超过 1000 行的输入 这意味着将显示较旧的按向上箭头命令 这可能吗 可能在 ipython config 的某个地方 Thanks In http 2sn org
  • 返回私有项目的私有内部模块给出“公共接口中的私有类型”错误

    在下面的示例中 模块outer有一个私有类型Private和一个私有内部模块inner inner能够访问Private 因为子模块可以访问其父模块的私有项目 即使它们不是公共停车 inner定义一个函数not really public
  • ASP.NET MVC 每个View的静态内容的路由策略

    我希望系统中的每个视图都有一些静态帮助内容 我考虑的方法是为静态内容设置一个并行结构 并创建一个路由来重写该结构的 URL 例如 Controllers Help Account Login htm Create htm Models Vi
  • PHP中重定向头之后的所有代码都会被执行吗?

    所以我知道一般的经验法则是在 PHP 中进行标头重定向后 您应该调用 exit 以避免运行额外的代码 但我想知道您是否将代码放在重定向标头之后 如果它会always run 我正在对 Google Analytics 中跟踪推荐的各种方法进
  • Android:以编程方式调用 nDrawDisplayList

    我的应用程序相当复杂 有两到三个大约 500 毫秒的延迟 TraceView 显示在GLES20Canvas nDrawDisplayList 这些腿只在执行某些步骤时出现一次 之后一切都会顺利进行 有没有办法在活动创建 恢复时调用此调用
  • 无法使用 Mobility 按 Rails 中翻译的列进行排序

    这个问题是基于一个issue https github com shioyama mobility issues 169发布到 Mobility GitHub 项目 Context Rails 5 0 6 Mobility 0 4 2 带表
  • 有没有办法让后台任务通知终端打印新的提示?

    我想写一个程序can作为后台任务运行 即my thing 这将在必要时完美地提供相关输出 然而 对于打印到终端的后台任务 总是存在这种令人讨厌的小进展 bash 3 2 my thing bash 3 2 my thing bash 3 2
  • Javascript正则表达式删除空格

    所以我正在为 JQuery 编写一个小插件来删除字符串中的空格 see here http jsfiddle net rlemon ge59E function stripSpaces function str var reg new Re
  • 在 grep/ack 中转义括号

    我想查找字符串 methodname 但我无法转义 我怎样才能得到 grep methodname or ack grep methodname to work 有两件事可以解释 外壳 以及ack grep 您可以使用 or 为了逃避 来自
  • python信号,中断系统调用

    我正在用 python 编写一个程序 我希望从 stdin 读取并处理 sigchld 我想在输入时处理任一输入 而不旋转 推测性地对输入进行采样 我无法在每次调用时捕捉到被信号中断的系统调用 我是否以错误的方式处理这个问题 我可以在不尝试
  • VBA 宏 (Excel) 中出现错误“过程太大”

    我正进入 状态Procedure too Large Error在 VBA 宏中 我使用的是 MS Excel 2003 如果您的程序超过 64kb 您将收到该错误 这些是您可以压缩代码的一些事情 1 摆脱重复的代码 看这个例子 Sub S
  • 如何获得SQL Server 2005数据库的独占访问权限来恢复?

    每当我在 SQL Server 中恢复数据库备份时 都会出现以下错误 Msg 3101 Level 16 State 1 Line 1 Exclusive access could not be obtained because the d
  • 如何使用 Java 在 Play Framework 2.0 中测试文件上传的多部分表单数据请求?

    据我所知 您可以按照此处的建议使用 Scala API 来执行此操作 https groups google com forum fromgroups topic play framework 1vNGW lPi9I https group
  • 在 Spring-boot 上将 Spring Batch 与 spring-batch-admin-manager 集成时出错

    我正在尝试使用 spring boot 嵌入式 tomcat 配置将 spring batch admin manager 与 spring boot starter batch 集成在一起 但是我有这个错误跟踪 我无法确定 org spr
  • 如何在 scala 中解析 json 列表或数组以用于 play 框架 2.2

    我正在编写一些 RESTful API 测试用例 并且对 scala playframwork 的使用经验很少 这是我的 JSON 的示例 size 5082 date created Wed Nov 19 17 10 39 CST 201
  • 选择复选框 Angular 中的所有项目

    我有一个包含多个复选框的列表 我做了一个单选和多选的功能 用户可以获取单选和多选的数据 现在我遇到的问题是 当我删除列表中一个复选框的选择 然后选择所有复选框时 应该取消选择 但我无法做到这一点 下面是我的代码 超文本标记语言 div cl
  • AVAudioPlayer 播放时游戏滞后

    我正在创建一个游戏 用户用喷气背包控制角色 当喷气背包与钻石相交时 我将钻石添加到它们的总数中 然后播放声音 然而 声音会使游戏暂停十分之一秒左右并扰乱流程 这是我正在使用的代码 var diamondSound NSBundle main