2016-06-16 9 views
1

우선 내가 도움을 청할 사람에게 감사드립니다.Swift 2 Spritekit : 게임이 일시 중지 상태 일 때 배경 음악이 재개되지 않는 문제

저는 인터넷을 통해 광범위하게 검색했으며 내 문제에 대한 해결책을 찾을 수 없습니다. 내 문제는 SpriteKit 프레임 워크를 사용하여 구축중인 iOS 게임입니다. SKAudioNode를 사용하여 배경 음악을 추가했으며 처음에는 잘 작동하지만 몇 초 이내에 게임을 일시 중지하고 재생하면 음악이 다시 재생되기 시작하지 않습니다. 게임을 일시 중지 할 때 SKAudioNode를 제거하고 게임을 다시 시작할 때 SKAudioNode를 제거하는 등의 많은 작업을 시도했지만 아무 것도 작동하지 않았습니다. 나는 가능한 한 관련 유지 아래 내 코드의 조각을 게시 한 :

class GameScene: SKScene, SKPhysicsContactDelegate { 
    var backgroundMusic = SKAudioNode(fileNamed: "bg.mp3")  
    let pauseImage = SKTexture(imageNamed: "pause.png") 
    var pauseButton:SKSpriteNode! 
    let playImage = SKTexture(imageNamed: "play2.png") 
    var playButton:SKSpriteNode! 

    override func didMoveToView(view: SKView) { 
     self.addChild(backgroundMusic) 

     // create pause button 
     pauseButton = SKSpriteNode(texture: pauseImage) 
     pauseButton.position = CGPoint(x: self.size.width - pauseButton.size.width, y: pauseButton.size.height) 
     pauseButton.zPosition = 1 
     pauseButton.name = "pauseButton" 
     self.addChild(pauseButton) 

     // create play button 
     playButton = SKSpriteNode(texture: playImage) 
     playButton.position = CGPoint(x: self.size.width - playButton.size.width, y: -playButton.size.height) 
     playButton.zPosition = 1 
     playButton.name = "playButton" 
     self.addChild(playButton) 
    } 

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch in touches { 
      if pauseButton.containsPoint(touch.locationInNode(self)) { 
       let blockOne = SKAction.runBlock({ 
        self.pauseButton.position.y = -  self.pauseButton.size.height 
        self.playButton.position.y = self.playButton.size.height 
       }) 

       let blockTwo = SKAction.runBlock({ 
        self.view?.paused = true 
       }) 

       self.runAction(SKAction.sequence([blockOne, blockTwo])) 
      } 
      else if(playButton.containsPoint(touch.locationInNode(self))) { 
       self.playButton.position.y = -self.playButton.size.height 
       self.pauseButton.position.y = self.pauseButton.size.height 
       self.view?.paused = false 
      } 
     } 
    } 
} 
당신은 게임의 주위에 데이터를 전달하기 위해 AVAudioPlayer 및 NSNotificationCenter를 사용하여 보길 원하는 것
+0

Corey는 배경 음악에 대한 AVPlayer를 제안했을 수 있습니다. 나는 SKAudioNodes에 관한 문제 만 가지고있다. 그들은 일시 정지/다시 시작하지 않으며, 필요할 때까지 사운드를 내지 않으며 항상 깨지기 때문에 소리를 내고 1 초 사운드를 재생합니다. – crashoverride777

답변

2

.

실제 GameViewController 클래스에서 백그라운드 오디오 플레이어를 시작하십시오. 이렇게하면 SKAudioNode를 사용하는 것이 좋습니다. 게임 플레이에서 발생하는 것과 관련된 사운드 효과와 같은 사운드에 더 가깝습니다.

AVAudioPlayer를 사용하면 음악이 일시 정지 된 상태에서 이전 지점에서 계속 재생할 수 있습니다.

이것은 진행 상황에 관계없이 실행되는 몇 가지 사항 중 하나입니다. 그래서 GameViewController에 넣습니다.

그래서 여기에 당신이 오디오 플레이어를 사용하려면 다음 때 우리가 그런

import AVFoundation 

var bgMusicPlayer:AVAudioPlayer? 

을 시작 GameViewController 우리는

override func viewDidLoad() { 



super.viewDidLoad() 


// PlayBackgroundSound , PauseBackgroundSound will be your code to send from other "scenes" to use the audio player // 

// NSNotificationCenter to pass data throughout the game // 

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.playBackgroundSound(_:)), name: "PlayBackgroundSound", object: nil) 



NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(GameViewController.pauseBackgroundSound), name: "PauseBackgroundSound", object: nil) 

} 

func playBackgroundSound(notification: NSNotification) { 


let name = notification.userInfo!["fileToPlay"] as! String 



if (bgSoundPlayer != nil){ 

    bgSoundPlayer!.stop() 
    bgSoundPlayer = nil 


} 

if (name != ""){ 

    let fileURL:NSURL = NSBundle.mainBundle().URLForResource(name, withExtension: "mp3")! 

    do { 
     bgSoundPlayer = try AVAudioPlayer(contentsOfURL: fileURL) 
    } catch _{ 
     bgSoundPlayer = nil 

    } 

    bgSoundPlayer!.volume = 1 
    bgSoundPlayer!.numberOfLoops = -1 

// -1 will loop it forever // 

    bgSoundPlayer!.prepareToPlay() 
    bgSoundPlayer!.play() 

    } 
} 


func pauseBackgroundSound() { 

    if (bgSoundPlayer != nil){ 

     bgSoundPlayer!.pause() 



    } 

} 

이러한 기능을 내리는 데 필요한 것 GameViewController 코드의 예 일시 중지 또는 다시 시작 버튼 기능에서

각 장면에서 플레이어를 사용해야합니다.

import AVFoundation.AVAudioSession 

override func didMoveToView(view: SKView) { 

    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient) 

} 

그런 다음 일시 중지하거나 재생하려면 NSNotificationCenter를 사용하십시오.

// 당신은 음악

NSNotificationCenter.defaultCenter().postNotificationName("PauseBackgroundSound", object: self) 
을 일시 정지하는 데 필요한 기능에 코드 줄을 사용하는 장면에서 일시 정지하려면

/// 처음 플레이하거나 새 노래는 ...에 코드 줄을 사용하려면 음악을 재생하는 데 필요한 기능

NSNotificationCenter.defaultCenter().postNotificationName("PlayBackgroundSound", object: self, userInfo: "FILE NAME OF BACKGROUND MUSIC") 
+0

답변 해 주셔서 대단히 감사합니다. 나는 이것을 시도해보고 그것이 어떻게 진행되는지 알려 줄 것이다. –

+0

작동하는 경우 대답을 수락하는 것을 기억하십시오. 그것은 아주 상세한 답변이므로 upvoted하고 받아 들일 수 있다면 좋을 것입니다. –

+0

귀하의 답변을 수락했습니다. 지연에 대한 사과, 나는 지난 며칠 동안 매우 바빴다. 당신의 대답은 매우 도움이되었습니다. –

관련 문제