我有两个场景,我希望背景音乐同时播放 . 问题是音乐仅在应用程序首次打开时播放 . 如果我按下按钮转到第二个场景,音乐在场景转换时播放,但在转换结束时停止 . 第二个场景没有音乐,如果我回到第一个场景那里也没有音乐 . 音乐总是在场景之间的过渡期间播放(这就是为什么我使用很长的过渡时间,只是为了确认(我不知道为什么) .
class GameScene: SKScene {
var backgroundMusic: SKAudioNode!
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
override func didMoveToView(view: SKView) {
/* Setup your scene here */
backgroundColor = SKColor.redColor()
global.centerPoint = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame)))
let myLabel = SKLabelNode(fontNamed:"Helvetica Bold")
myLabel.text = "GameScene"
myLabel.fontSize = 45
myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + 100)
self.addChild(myLabel)
createBtn()
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// MUSICA
if let musicURL = NSBundle.mainBundle().URLForResource("music", withExtension: "wav") {
backgroundMusic = SKAudioNode(URL: musicURL)
addChild(backgroundMusic)
print("backgroundMusic OK")
} else {
print("backgroundMusic file not found!")
}
} // END override func didMoveToView
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
let touch = touches //as! Set<UITouch>
let location = touch.first!.locationInNode(self)
let node = self.nodeAtPoint(location)
if (node.name == "btnOne") {
let reveal = SKTransition.pushWithDirection(.Left, duration: 2.5)
let scene = SceneTwo(size: size)
self.view?.presentScene(scene, transition:reveal)
}
} // END override func touchesBegan
对于第二个文件/场景我使用相同的代码:
class SceneTwo: SKScene {
var backgroundMusicTwo: SKAudioNode!
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
override func didMoveToView(view: SKView) {
/* Setup your scene here */
backgroundColor = SKColor.blueColor()
global.centerPoint = CGPoint(x:(CGRectGetMidX(self.frame)), y:(CGRectGetMidY(self.frame)))
let myLabel = SKLabelNode(fontNamed:"Helvetica Bold")
myLabel.text = "SceneTwo"
myLabel.fontSize = 45
myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame) + 100)
self.addChild(myLabel)
createBtn()
// # # # # # # # # # # # # # # # # # # # # # # # # # # #
// MUSICA
if let musicURL = NSBundle.mainBundle().URLForResource("music", withExtension: "wav") {
backgroundMusicTwo = SKAudioNode(URL: musicURL)
addChild(backgroundMusicTwo)
print("backgroundMusicTwo OK")
} else {
print("backgroundMusicTwo file not found!")
}
} // END override func didMoveToView
2 回答
我认为它不会播放的原因是因为一旦场景改变,音频节点将被释放 . 我不确定为什么它只在转换之间进行 . 我也从未使用过音频节点,但我确实创建了自己的自定义类来处理所有音频 .
另外,我不会复制和粘贴代码 . 当你只有一个类来处理音频时,你在两个场景中都有相同的代码 . 这是一个使用我制作的名为JKAudioPlayer的自定义类的解决方案 . 只需创建一个新的Swift类并将代码粘贴到其中 . 由于稍后声明的音频对象不是场景的一部分,因此在转换时它将继续/允许播放音乐 .
要使用它,请创建一个可以访问音频的全局变量 .
然后,当您想要播放音乐时,可以在场景类的didMoveToView函数中轻松调用它 .
您还可以通过调用暂停/停止/恢复音乐功能来控制它,如下所示:
如果您希望用户能够在后台播放自己的音乐,例如从他们的iTunes资料库中播放他们的音乐,那么您可以在GameViewController的viewDidLoad函数中将canShareAudio设置为true .
这里是测试和工作的Swift 3的代码你需要将文件的扩展名放在最后,否则它将无法找到声音文件
在一个新的Swift文件中复制和粘贴
播放任何文件只是简单地插入
并停止音乐只是放在你需要停止的地方