How to stop/cancel playSoundFileNamed in Swift?

余生长醉 提交于 2019-12-22 10:01:55

问题


I'm trying to make a button, which is when pushed - the sound is played, and when pushed again - the sound would stop. I'm using playSoundFileNamed: runAction: withKey: and removeActionForKey, but it doesn't work.

The other question I have is if there is a way not only to stop the sound, but also to pause it (so that it will start from the same part it was paused, NOT from the beginning). I've seen a similar topic at stack overflow, but yet didn't find an answer on my question yet. Thank you in advance.

import SpriteKit
import AVFoundation

var firesoundon = false

private var backgroundMusicPlayer: AVAudioPlayer!

class GameScene2: SKScene {

override func didMoveToView(view: SKView) {

    setUpScenery()    
}

private func setUpScenery() {


    //BACKGROUND
    let background = SKSpriteNode(imageNamed: backgroundImage, normalMapped: true)
    addChild(background)


    //FIRE BUTTON

    var firePath = UIBezierPath() 
    firePath.moveToPoint(CGPointMake(0, 0)) 
    firePath.addCurveToPoint(CGPointMake(115, 215), controlPoint1: CGPointMake(5, 170), controlPoint2: CGPointMake(90, 190)) ....

//^I'm just cutting down a lot of path here - the button is drawn and it's pushable/workable.

    let fireNode = SKShapeNode(path: firePath.CGPath, centered: false)
    fireNode.alpha = 0.2

    fireNode.position = CGPointMake(size.width/2, 0)
    fireNode.name = "fireNode"

        self.addChild(fireNode)
}

//So, this is a main bummer for me:

func fireturnonoff () {

    if firesoundon == false {

        var playguitar = SKAction.playSoundFileNamed("guitar.wav", waitForCompletion: true)
        runAction(playguitar, withKey: "soundsison")

        firesoundon = true
        println("firesoundon is == \(firesoundon)")

    }

    else if firesoundon == true {

        removeActionForKey("soundsison")
        println("REMOVED")

        firesoundon = false
        println("firesoundon is == \(firesoundon)")

    }

}


override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let touch = touches.first as? UITouch

        let touchLocation = touch!.locationInNode(self)
        let node: SKNode = nodeAtPoint(touchLocation)

        if node.name == "fireNode" {

            fireturnonoff()

        }
}
}

回答1:


Use AVAudioPlayer. It allows you to start, stop, pause, control volume, number of loops and other features.




回答2:


New functionality has been added to Swift for SKActions:

class func stop() -> SKAction

It creates an action that tells an audio node to stop playback. This action may only be executed on an SKAudioNode object. The audio is stopped, and if restarted, begins at the beginning. This action is not reversible.

Unfortunately, available only in iOS 9.0 and later.




回答3:


Now you can stop playing sound action by assigning key string for it then using removeActionForKey later like this:

let action: SKAction = SKAction.playSoundFileNamed("sounds/boom.wav", waitForCompletion: true)
self.runAction(action, withKey:"die-sound")
// later you do:
self.removeActionForKey("die-sound")

I have tested successful



来源:https://stackoverflow.com/questions/29546063/how-to-stop-cancel-playsoundfilenamed-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!