iosswiftxcodesprite-kitskaction

How stop SKAction background music


I'm trying to make a game and in the main menu, there is a label to start music, and another to stop music.

let backgroundMusic = SKAction.playSoundFileNamed("background.mp3", waitForCompletion: false)

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch in touches {
            let location = touch.location(in: self)
            let touchedNode = atPoint(location)
            if touchedNode.name == self.BEGIN_MUSIC {
                // start music
                self.run(backgroundMusic)
            }
            if touchedNode.name == self.STOP_MUSIC {
                // stop music
                SKAction.stop()
            }
        }
    }

the music starts fine and works on all scenes which is what i wanted. But when I press the stop music, the music keeps playing. How do I stop the music.

I've tried SKAction.pause(), i've tried using withKey: "music" and then self.removeAction(forKey: "music").

I also tried making backgroundMusic: SKAudioNode and this worked but once i stopped the music i couldn't turn it back on, also it doesn't work on any other scene just the main menu.

How do I stop the sound?


Solution

  • I've had the same issue a while ago: This is how I got it working. This is specific for background music.

       var backgroundMusic: AVAudioPlayer!
    
    
       func playMusic() {
          if let musicURL = Bundle.main.url(forResource: "musicSource", withExtension: "wav") {
              if let audioPlayer = try? AVAudioPlayer(contentsOf: musicURL) {
                  backgroundMusic = audioPlayer
                  backgroundMusic.numberOfLoops = -1
                  backgroundMusic.play()
                  backgroundMusic.volume = 0.2
                
              }    
          }
       }
    
    
       override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
         super.touchesBegan(touches, with: event)
    
          if let touch = touches.first {
              let pos = touch.location(in: self)
              let node = self.atPoint(pos)
    
           let musicOff = UserDefaults.standard.bool(forKey: "musicOff")
    
           if node == musicButton && musicOff == false {
    
                   backgroundMusic.stop()
                   UserDefaults.standard.set(true, forKey: "musicOff")
    
           }
    
           if node == musicButton && musicOff == true {
    
                    backgroundMusic.play()
                    backgroundMusic.volume = 0.3
                    UserDefaults.standard.set(false, forKey: "musicOff")
    
           }
         }
       }