2017-03-09 60 views
2

如何在我的設置中製作「激活/關閉背景音樂」按鈕?Swift:根據遊戲狀態,如何製作UISwitch按鈕作爲設置?

音樂只在遊戲啓動時播放。 (點擊「開始」播放 - >背景音樂也播放。)

我已經編碼了這一刻,但我真的不知道該怎麼做。

class SettingsViewController: UITableViewController { 
    // MARK: - IBOutlets 
    @IBOutlet weak var backgroundgMusicLabel: UILabel! 
    @IBOutlet weak var backgroundMusicSwitch: UISwitch! 

    // MARK: - Lifecycle 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func backgroundMusicPressed(_ sender: Any) { 
     if backgroundMusicSwitch.isOn { 
      UserDefaults().set("On", forKey: "switch") 
     } else { 
      UserDefaults().set("Off", forKey: "switch") 
     } 
    } 
} 

SettingsViewController

雖然我有這個代碼在我MainViewController:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if game == .ready { 
     start() 
    } 
} 

和我一起玩音樂是這樣的:

var audioPlayer: AVAudioPlayer? 

func playMusic() { 
    let url = Bundle.main.url(forResource: "MyMusic", withExtension: "mp3")! 
    do { 
     audioPlayer = try AVAudioPlayer(contentsOf: url) 
     guard let audioPlayer = audioPlayer else { return } 
     audioPlayer.prepareToPlay() 
     audioPlayer.play() 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 

回答

2

TheValyreanGroup與Globals合適。

class Globals: NSObject { 
    static let sharedInstance = Globals() 
    var audioPlayer: AVAudioPlayer? 

    func playMusic() { 
     let url = Bundle.main.url(forResource: "MyMusic", withExtension: "mp3")! 
     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: url) 
      guard let audioPlayer = audioPlayer else { return } 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

但在你的情況下,嘗試下面的代碼:

MainViewController:

static let sharedInstance = Globals() 
let globalVars = Globals.sharedInstance 

而在你開始添加此FUNC()功能:

func checkMusicStatus() { 
    let status = UserDefaults().string(forKey: "switch") 
    if status == "Off"{ 
     if (self.globalVars.audioPlayer?.isPlaying != nil){ 
      self.globalVars.audioPlayer?.stop() 
     } 
    } else { 
     self.globalVars.playMusic() 
    } 
} 

它應該工作,希望這會有所幫助。

0

當我需要做的事情像這樣我喜歡使用SharedInstance類。一些人稱它爲單身,但我不相信它實際上是。

創建一個新的swift文件並將其命名爲'Globals'。聲明你想要在VC之間共享的任何變量或對象,你也可以創建全局函數。請記住,這些都將是同一個例子。這與在VC之間傳遞變量或者獲取另一個VC的另一個實例不同。

Globals.swift

class Globals: NSObject { 

    static let sharedInstance = Globals() 

    var audioPlayer: AVAudioPlayer? 

    func playMusic() { 
     let url = Bundle.main.url(forResource: "MyMusic", withExtension: "mp3")! 
     do { 
      audioPlayer = try AVAudioPlayer(contentsOf: url) 
      guard let audioPlayer = audioPlayer else { return } 
      audioPlayer.prepareToPlay() 
      audioPlayer.play() 
     } catch let error { 
      print(error.localizedDescription) 
     } 
    } 
} 

現在,在你的任何VC的,你聲明這個新Globals類的類範圍的變量,並通過預先globalVars

class SettingsViewController: UITableViewController { 
    // MARK: - IBOutlets 
    @IBOutlet weak var backgroundgMusicLabel: UILabel! 
    @IBOutlet weak var backgroundMusicSwitch: UISwitch! 

    let globalVars = Globals.sharedInstance() 

    // MARK: - Lifecycle 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func backgroundMusicPressed(_ sender: Any) { 
     if backgroundMusicSwitch.isOn { 
      UserDefaults().set("On", forKey: "switch") 
      self.globalVars.audioPlayer.play() //Uses the same instance of the audioPlayer you created in the 'Globals' class 
     } else { 
      UserDefaults().set("Off", forKey: "switch") 
      self.globalVars.audioPlayer.stop() 
     } 
    } 
} 
使用任何從它的對象

由於您的playMusic函數已移至此新類,因此您將以同樣的方式調用它。

self.globalVars.playMusic() 

我知道有很多人在使用所謂的「全局變量」皺眉,不過,我覺得這個共享的實例類在很多情況下是非常有用的。尤其是遊戲。這也是我如何保持所有擴展,子類,可以重新使用的自定義函數等的「正在運行」的類。我只將這個文件包含在我的所有項目中,並且可以立即訪問所有我最喜歡的函數。