2017-03-09 6 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はグローバルで正しいです。

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クラスを使いたい。 poepleはそれをシングルトンと呼んでいますが、実際には信じられません。

新しい迅速なファイルを作成し、「グローバル」のような名前を付けます。 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のいずれかで、あなたはこの新しいグローバルクラスのクラススコープの変数を宣言し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() 

が、私は多くの人がいわゆる「グローバル変数」を使用した時に顔をしかめ知っている、しかし、私は多くのシナリオで非常に有用で、この共有インスタンスクラスを見つけます。特にゲーム。これはまた、私のすべての拡張機能、サブクラス、再利用可能なカスタム関数などの "実行中の"クラスを維持する方法です。私はすべてのプロジェクトにこの同じファイルを含めて、すぐに私のお気に入りの関数にすべてアクセスできます。

関連する問題