如何在Swift中停止/取消playSoundFileNamed?

时间:2015-04-09 18:20:53

标签: swift sprite-kit avfoundation

我正在尝试按下一个按钮,这个按钮被按下 - 播放声音,再次按下时 - 声音会停止。 我正在使用playSoundFileNamed: runAction: withKey:removeActionForKey,但它不起作用。

我遇到的另一个问题是,是否有一种方法不仅可以停止声音,还可以暂停它(这样它就会从暂停的同一部分开始,而不是从头开始)。 我在堆栈溢出时看到过类似的话题,但还没有找到我的问题的答案。提前谢谢。

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)) ....

// ^我只是在这里减少了许多路径 - 按钮被绘制并且可以推送/可行。

    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)
}

//所以,这对我来说是一个主要的失败:

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()

        }
}
}

3 个答案:

答案 0 :(得分:2)

使用AVAudioPlayer。它允许您启动,停止,暂停,控制音量,循环次数和其他功能。

答案 1 :(得分:0)

Swift为SKActions添加了新功能:

class func stop() -> SKAction

它会创建一个动作,告诉音频节点停止播放。 此操作只能在SKAudioNode对象上执行。音频停止,如果重新启动,则从头开始。这个动作是不可逆转的。

不幸的是,仅在iOS 9.0及更高版本中可用。

答案 2 :(得分:-1)

现在您可以通过为其分配关键字符串来停止播放声音操作,然后再使用removeActionForKey,如下所示:

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

我测试成功了