2017-04-13 70 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()