如何在SKSpriteNode的音频从场景中移除后停止该音频(Swift)?

如何在SKSpriteNode的音频从场景中移除后停止该音频(Swift)?,swift,sprite-kit,skspritenode,skaction,sknode,Swift,Sprite Kit,Skspritenode,Skaction,Sknode,这是我的密码: override func didMoveToView(view: SKView) { /* Setup your scene here */ let backgroundImage = SKSpriteNode(imageNamed: "Background.jpeg") backgroundImage.size = self.frame.size backgroundImage.position = CGPoint(x: self.frame

这是我的密码:

 override func didMoveToView(view: SKView) {
    /* Setup your scene here */
    let backgroundImage = SKSpriteNode(imageNamed: "Background.jpeg")
    backgroundImage.size = self.frame.size
    backgroundImage.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2)
    backgroundImage.zPosition = 1
    self.addChild(backgroundImage)


    let addBugAction = SKAction.sequence([SKAction.runBlock({
        self.addBugsToScene()
    }), SKAction.waitForDuration(1)])
    self.runAction(SKAction.repeatActionForever(addBugAction))

}

func addBugsToScene() {

    let bug = SKSpriteNode(imageNamed: "Mos2.gif")
    bug.name = "Mosquito"


    //giving random position to and assigning to bugs
    let randomPoint = gettingRandomPosition(bug.size)
    bug.position = CGPoint(x: randomPoint.x, y: randomPoint.y)
    bug.zPosition = 12



    let blockOFaction = SKAction.runBlock({

        let randomMovingPoint = self.gettingRandomPosition(bug.size)

         let action = SKAction.moveTo(CGPoint(x: randomMovingPoint.x, y: randomMovingPoint.y), duration: 2)

        //action.speed = 3.0
        let movePlusSoundAction = SKAction.group([action,SKAction.playSoundFileNamed("MosquitoNoise.wav", waitForCompletion: false)])

        bug.runAction(movePlusSoundAction)

    })
    let waitAction = SKAction.waitForDuration(1)
    bug.runAction(SKAction.repeatActionForever(SKAction.sequence([blockOFaction, waitAction])))


    self.addChild(bug)

}



override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
    {        

   /* Called when a touch begins */

    for touch in touches {
        let location = touch.locationInNode(self)

        let touchedNode = self.nodeAtPoint(location)

        if touchedNode.name == "Mosquito"{

            touchedNode.removeAllActions()

            //touchNode.runAction(SKAction.Stop())

            //removing the bug which is tapped
            touchedNode.removeFromParent()
        }
    }
}
覆盖func didMoveToView(视图:SKView){
/*在这里设置场景*/
让backgroundImage=SKSpriteNode(图像名为:“Background.jpeg”)
backgroundImage.size=self.frame.size
backgroundImage.position=CGPoint(x:self.frame.width/2,y:self.frame.height/2)
backgroundImage.zPosition=1
self.addChild(背景图片)
让addBugAction=SKAction.sequence([SKAction.runBlock({
self.addBugsToScene()
}),SKAction.waitForDuration(1)])
self.runAction(SKAction.repeatActionForever(addBugAction))
}
func addBugsToScene(){
让bug=SKSpriteNode(图像名为:“Mos2.gif”)
bug.name=“蚊子”
//给Bug提供随机位置并分配给Bug
让randomPoint=GettingAndomposition(bug.size)
bug.position=CGPoint(x:randomPoint.x,y:randomPoint.y)
bug.zPosition=12
让blockOFaction=SKAction.runBlock({
让randomMovingPoint=self.gettingAndomposition(bug.size)
让action=SKAction.moveTo(CGPoint(x:randomMovingPoint.x,y:randomMovingPoint.y),持续时间:2)
//动作速度=3.0
让movePlusSoundAction=SKAction.group([action,SKAction.PlaySoundFileName(“MosquitoNoise.wav”,waitForCompletion:false)])
bug.runAction(moveplusUndaction)
})
让waitAction=SKAction.waitForDuration(1)
bug.runAction(SKAction.repeatActionForever(SKAction.sequence([blockOFaction,waitAction]))
self.addChild(bug)
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?)
{        
/*当触摸开始时调用*/
接触{
let location=touch.locationInNode(自)
让touchedNode=self.nodeAtPoint(位置)
如果touchedNode.name==“蚊子”{
touchedNode.removeAllActions()
//touchNode.runAction(SKAction.Stop())
//删除被点击的错误
touchedNode.removeFromParent()
}
}
}
当我触摸节点(bug)时,它将从场景中移除。在这里,我试图停止播放与错误相关的音频。但即使节点从场景中移除,音频仍会继续播放。如何在节点从场景中移除后立即停止音频?

只播放声音。您无法控制正在播放的声音(无法暂停、取消暂停、停止等)。有些人说,你可以为声音动作指定一个键,然后通过移除键来停止动作。到目前为止,这对我来说从未奏效(在许多iOS版本上试用过)

另外,我上一次用操作键尝试这个技巧的iOS版本是9.1…所以,有一个机会,你可以在9.3上试试

不管怎么说,这是来自文档:

使用名为:waitForCompletion:的SKAction PlaySoundFileName: 杂费。使用AVAudioPlayer播放长时间播放的背景音乐。这 行动是不可逆的;反向动作与反向动作相同 最初的行动

所以,它只是播放短音,就这样


作为一种替代方法,您可以使用,但它仅在iOS9及更高版本上可用。

以下是我如何编码以获得结果的

我在addBugtosene()中添加了以下代码

let mosquitoNoise=SKAudioNode(文件名为:“mosquitoNoise.wav”)
mosquitoNoise.autoplayLooped=true
驱蚊行动(SKAction.changeVolumeTo(0.3,持续时间:60))
臭虫。addChild(蚊子病)
//此处所做的更改
让MOVEPLUSOUNDACTION=SKAction.group([action,SKAction.runBlock({
mosquitoNoise.runAction(SKAction.play())
})])
bug.runAction(moveplusUndaction)
})
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
/*当触摸开始时调用*/
接触{
let location=touch.locationInNode(自)
让touchedNode=self.nodeAtPoint(位置)
如果touchedNode.name==“蚊子”{
//删除SKAudioNode,以便音频停止
touchedNode.removeAllChildren()
//删除被点击的错误
touchedNode.removeFromParent()
}

顺便说一句,在闭包中使用self-like并永远重复该操作,肯定会使场景无法正确地去噪。或者使用捕获列表(类似于
[无主self]
),或在实际转换到下一个场景之前删除该操作。始终检查是否正确调用了场景的
deinit
(对每个自定义类执行此操作)@Whirlwind我不知道这件事,但我会研究并实施。再次感谢您帮助我改进代码。我使用SKAudioNode实现,现在它工作正常。谢谢!
let mosquitoNoise = SKAudioNode(fileNamed: "MosquitoNoise.wav")
    mosquitoNoise.autoplayLooped = true
    mosquitoNoise.runAction(SKAction.changeVolumeTo(0.3, duration: 60))
    bug.addChild(mosquitoNoise)

//changes made here
 let movePlusSoundAction = SKAction.group([action,SKAction.runBlock({

            mosquitoNoise.runAction(SKAction.play())
            })])

        bug.runAction(movePlusSoundAction)

    })


 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
   /* Called when a touch begins */

    for touch in touches {
        let location = touch.locationInNode(self)

        let touchedNode = self.nodeAtPoint(location)

        if touchedNode.name == "Mosquito"{

            //removes the SKAudioNode so audio will stop
            touchedNode.removeAllChildren()

            //removing the bug which is tapped
            touchedNode.removeFromParent()

        }