2015-08-24 3 views
1

В настоящее время у меня есть игра, над которой я работаю, игра состоит из трех диспетчеров вида: GameIntroViewControllerGameViewControllerGameOverViewController.swift - фоновая музыка и segues

Каждый контроллер вида соединен нажатием segue. используя следующий метод ...

GameIntroViewController кнопка ->GameViewController программно ->GameOverViewController кнопка ->GameViewController и так далее ....

В настоящее время я создал приложение, чтобы начать воспроизведение фоновой музыки в мой GameIntroViewController, это хорошо работает, однако музыка неожиданно начинается с каждого сеанса, в то время как это не проблема, я бы хотел, чтобы музыка не перезапустилась, но продолжайте, как если бы она была одним треком, непрерывным с помощью segues.

В конечном счете мне нужна музыка для паузы или остановки, когда GameOverViewController показан как музыкальные столкновения с любыми видеообъявлениями, которые затем играют. Кто-нибудь знает лучший способ сделать это?

Думать об этом было бы здорово, если бы у меня была отличная музыка на GameIntroViewController и GameViewController, а затем нет музыки на GameOverViewController. Любые идеи о том, как я могу достичь этого, без того, чтобы музыка играла поверх друг друга?

Вот мой код до сих пор ..... (все GameIntroViewController)

import AVFoundation 

class GameIntroViewController: UIViewController { 

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer() 

override func viewDidLoad() { 
    super.viewDidLoad() 


} 


override func viewWillLayoutSubviews() { 
    var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")! 
    backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil) 
    backgroundMusicPlayer.numberOfLoops = -1 
    backgroundMusicPlayer.prepareToPlay() 
    backgroundMusicPlayer.play() 
} 

Спасибо всем, кто может помочь ...

ответ

2

Вы в настоящее время создает новый объект AVAudioPlayer каждый время новый контроллер инициализируется:

class GameIntroViewController: UIViewController { 
    var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer() 
} 

Вы должны сделать свой объект AVAudioPlayer глобальный, и установить его один раз. Как так:

var backgroundMusicPlayer:AVAudioPlayer = AVAudioPlayer() 

class GameIntroViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     var bgMusicURL:NSURL = NSBundle.mainBundle().URLForResource("bgMusic", withExtension: "m4a")! 
     backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: bgMusicURL, error: nil) 
     backgroundMusicPlayer.numberOfLoops = -1 
     backgroundMusicPlayer.prepareToPlay() 
     backgroundMusicPlayer.play() 
    } 
} 

Также очень важно отметить: ТОЛЬКО настроить backgroundMusicPlayer РАЗ в viewDidLoad вашего GameIntroViewController в. В противном случае он будет повторно инициализироваться всякий раз, когда этот контроллер определяет его виды. Если вы настроите этот объект на других контроллерах, он также сбросит объект.

Этот способ делает это также позволяет воспроизводить и приостанавливать backgroundMusicPlayer из любого места приложения.

удачи,

ZR

+0

Спасибо, что сработал! Знаете ли вы, что я могу добавить в свой GameOverViewController, чтобы автоматически отключить фоновая музыка? –

+0

на viewWillAppear поместите код: backgroundMusicPlayer.pause() ИЛИ (to mute) do: backgroundMusicPlayer.volume = 0 – zrubenst

0

Я хотел бы, чтобы музыка не перезагружать, но по-прежнему, как будто это один трек прерывается перетекает

Так как вы хотите, чтобы музыка продолжайте, даже когда контроллеры представлений приходят и уходят, разумно, что управлять музыкой с ваших контроллеров просмотров - это неправильный путь. Вместо этого создайте другой объект типа контроллера для управления музыкой (включая аудиоплеер, список воспроизводимых дорожек и т. Д.). Создайте свой «музыкальный контроллер» в начале приложения и передайте его с одного контроллера вида на следующий, так как вы бы создали объект модели.Возможно, даже лучше, вы могли бы сделать список треков, чтобы играть часть модели данных приложения, чтобы контроллеры представлений могли влиять на предстоящие музыкальные треки, просто взаимодействуя с моделью - им даже не нужно было знать о музыкальном контроллере.

Смежные вопросы