【问题标题】:Stopping the background music when starting a game开始游戏时停止背景音乐
【发布时间】:2016-04-16 11:36:09
【问题描述】:

我使用以下代码在 GameViewController.swift 中启动应用程序时播放背景音乐:

class GameViewController: UIViewController {

// VARIABLES
var backgroundMusicPlayer : AVAudioPlayer!

// AUDIO PLAYER
func playBackgroundMusic(filename: String) {
    let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
    var error : NSError? = nil
    do {
        backgroundMusicPlayer = try AVAudioPlayer(contentsOfURL: url!)
    } catch let error1 as NSError {
        error = error1
        backgroundMusicPlayer = nil
    }
    if backgroundMusicPlayer == nil {
        print("Could not create audio player: \(error!)")
        return
    }
    backgroundMusicPlayer.numberOfLoops = -1
    backgroundMusicPlayer.prepareToPlay()
    backgroundMusicPlayer.play()
}

func stopBackgroundMusic() {
    backgroundMusicPlayer.stop()
}

override func viewDidLoad() {
    super.viewDidLoad()
    playBackgroundMusic("MainTheme.mp3")

<< Various irrelevant code >>
}

因为这是在 viewController 中运行的,所以它会通过菜单上的场景变化(即打开“商店”场景)持续存在并创建无缝轨道。当我单击菜单场景上的“播放”按钮时,我希望音乐停止,然后过渡到游戏。我在 GameViewController 中有 stopBackgroundMusic() 方法,但我不知道如何在菜单场景中调用它。 在菜单场景中我试过这个:

// TOUCH
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    let touch = touches.first as UITouch?
    let touchLocation = touch!.locationInNode(self)
    let touchedNode = self.nodeAtPoint(touchLocation)
    if touchedNode.name == "startGame" {
        GameViewController.stopBackgroundMusic()
        let transitionType = SKTransition.fadeWithDuration(2)
        let viewSize = self.view?.bounds.size
        let scene = GameScene(size: viewSize!)
        self.view?.presentScene(scene, transition: transitionType)
    }
}

但我收到一条错误消息,提示我在调用 stopBackgroundMusic() 时缺少参数 #1,它不应该需要任何参数。我把这个方法叫错了吗?谢谢!

【问题讨论】:

  • 您是要在整个应用程序中播放 MP3,还是只在 GameViewController 上播放 MP3?
  • 我希望 GameScene 播放它自己的 MP3,否则只播放 GameViewController
  • 我将音频播放器添加到视图控制器中,以便在场景发生变化时继续播放。我只需要它在某个场景 GameScene 出现时停止播放。

标签: ios swift sprite-kit 2d-games


【解决方案1】:

您通过使用 GameViewController 来引用您的类,但您的函数位于对象实例级别。

如果您在类级别声明变量和函数,您在 touchesBegan 函数中的代码应该可以正常工作。

static var backgroundMusicPlayer : AVAudioPlayer!
class func playBackgroundMusic(filename: String) ...
class func stopBackgroundMusic()

override func viewDidLoad() {
   super.viewDidLoad()
   GameViewController.playBackgroundMusic("MainTheme.mp3")

  << Various irrelevant code >>
}

【讨论】:

  • 谢谢!!这是完美的(:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
相关资源
最近更新 更多