开始游戏时停止背景音乐
Stopping the background music when starting a game
我使用以下代码在 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 中的 运行,它会通过更改菜单上的场景(即打开 "shop" 场景)并创建无缝轨道而持续存在。当我单击菜单场景上的 "Play" 按钮时,我希望音乐停止,然后过渡到游戏。我在 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,它不需要任何参数。我调用这个方法错了吗?谢谢!
您是通过使用 GameViewController 来引用您的 class,但您的函数处于对象实例级别。
如果您在 class 级别声明变量和函数,您在 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 >>
}
我使用以下代码在 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 中的 运行,它会通过更改菜单上的场景(即打开 "shop" 场景)并创建无缝轨道而持续存在。当我单击菜单场景上的 "Play" 按钮时,我希望音乐停止,然后过渡到游戏。我在 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,它不需要任何参数。我调用这个方法错了吗?谢谢!
您是通过使用 GameViewController 来引用您的 class,但您的函数处于对象实例级别。
如果您在 class 级别声明变量和函数,您在 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 >>
}