【问题标题】:How to play and pause music in SpriteKit如何在 SpriteKit 中播放和暂停音乐
【发布时间】:2016-01-15 02:25:09
【问题描述】:

我的游戏中有背景音乐。我尝试制作一种播放和暂停音乐的方法。

当我按下播放/暂停音乐按钮时,我的应用程序崩溃了。

我不明白为什么它不起作用。

主场景中的方法:(已编辑)

var SoundOnOff = SKSpriteNode(imageNamed: "MusicOn.png")

if (SoundOnOff.containsPoint(location)) {


        if BackgroundMusic.sharedHelper.isMuted() {
        //BackgroundMusic.sharedHelper.mute()
        BackgroundMusic.sharedHelper.pause()
        self.SoundOnOff.texture = SKTexture(imageNamed:"MusicOff.png")
        print("Music Off!")
        }
        else {
        //BackgroundMusic.sharedHelper.unmute()
        BackgroundMusic.sharedHelper.resume()
        self.SoundOnOff.texture = SKTexture(imageNamed:"MusicOn.png")
        print("Music On!")
        }
    }

BackgroundMusic 类(已编辑)

import AVFoundation

class BackgroundMusic: NSObject {


  internal let localDefaults = NSUserDefaults.standardUserDefaults()
  static let sharedHelper = BackgroundMusic()
    var BgMusic: AVAudioPlayer?

    /// Keys
    internal struct Key {
        static let muted = "MusicMuteState"
    }


    override init() {
        super.init()
        print("Music helper init")
        playBackgroundMusic()

        if isMuted() {
            mute()
        }
    }

    func playBackgroundMusic() {
        let aSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("Secrets of the Schoolyard", ofType: "mp3")!)
        do {
            BgMusic = try AVAudioPlayer(contentsOfURL:aSound)
            BgMusic!.numberOfLoops = -1
            BgMusic!.prepareToPlay()
            BgMusic!.play()
        } catch {
            print("Cannot play the file")
        }
    }

    func mute() {
        BgMusic!.volume = 0
        localDefaults.setBool(true, forKey: Key.muted)
    }

    /// Unmute
    func unmute() {
        BgMusic!.volume = 1
        localDefaults.setBool(false, forKey: Key.muted)
    }

    // Check mute state
    func isMuted() -> Bool {
        if localDefaults.boolForKey(Key.muted) {
            return true
        } else {
            return false
        }
    }
}

【问题讨论】:

  • 用安全展开替换每次出现的强制展开(例如使用if let ... else ...)并捕获实际错误,而不仅仅是打印一个固定的句子。然后,您将能够找到错误并修复它。
  • 我检查了一下,发现这条线有问题:BackgroundMusic.sharedHelper.playing
  • 如果您只针对 iOS 9,您可以选择使用 SKAudioNode
  • 我想稍后在 AVFoundation for iOS 8 中使用

标签: ios swift sprite-kit


【解决方案1】:

您的类是 AVAudioPlayer 的子类,但您实际上并没有使用自己的实例来播放音乐。当您使用 BackgroundMusic.sharedHelper.playing 时,您引用的是您的类的一个实例,而不是实际正在播放的 BgMusic 播放器。由于您的班级尚未使用任何声音文件进行初始化,因此我认为它无法正确处理 .playing

【讨论】:

    【解决方案2】:

    我最近回答了一个类似的问题。我也在使用我自己的音乐助手,这与你的类似。您应该在帮助程序中做一些不同的事情。

    On and off music/sfx for sprite kit

    GitHub:https://github.com/crashoverride777/Swift2-SpriteKit-Music-Helper

    【讨论】:

    猜你喜欢
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多