2017-04-13 97 views
3

我已经写在我的MainMenuScene.swift文件下面的代码静音和取消静音的背景音乐静音和取消静音斯威夫特Spritekit

var mute: Bool = false 

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 

    if nameOfTappedNode == "musicButton"{ 


      if mute { 
       //This runs if the user wants music 
       print("The button will now turn on music.") 
       mute = false 
       bgMusicPlayer?.volume = 1 //this is a .mp3 file 
      } else { 
       //This happens when the user doesn't want music 
       print("the button will now turn off music.") 
       mute = true 
       bgMusicPlayer?.volume = 0 
      } 


} 

我的问题是,我怎么就能够静音每.WAV和.mp3文件位于我的游戏内的每个场景?什么是最有效的方法?提前致谢!

回答

0

通过管理AVAudioPlayer,还是球员,用来展示它们。

我拥有一个全局的玩家阵列,当我想影响游戏中的所有玩家时,只需迭代该阵列即可。例如:

var engineSound: AVAudioPlayer! 
var shieldSound: AVAudioPlayer! 
var photonSound1: AVAudioPlayer! 
var photonSound2: AVAudioPlayer! 
var photonSound3: AVAudioPlayer! 
let arrayOfPlayers = [engineSound, shieldSound, photonSound1, photonSound2, photonSound3] 

func fadeAllPlayers() { 

    for player in arrayOfPlayers { 

     player.volume = 0 
    } 
} 

一个玩家不同的阵列(而不是一个单一的播放器)的好处是,你可以有不同的情况多的行为。

+0

那么你提到的数组和函数的作用域是什么?我认为这是包含在答案中的重要事实。 – Whirlwind

+0

我试图编辑答案,以澄清该数组是全局的,但堆栈溢出不会允许我这样做。尽管宗教对全球变数的抵制,但在媒体游戏应用中,我认为它们是必不可少的。 – jglasse

+0

您可以再试一次。可能我们都在同一时间编辑你的问题。无论如何,现在我们知道这个数组是全局的;) – Whirlwind

1

您可以使用辛格尔顿实现:

final class AudioManager { 

    static let instance = AudioManager() 
    //you should initialize it approp 
    private var player = //... initialize with whatever player you use 

    private init() { } 

    func play(){ 
     player.play() 
    }  
} 

那么无论你需要它(从每类):

AudioManager.instance.play() 
AudioManager.instance.muteAll() 
AudioManager.instance.someOtherInstanceMethod()