如何在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()
}