SKAudioNode else/ если выключен / включен Case

Я новичок в кодировании Swift и пытаюсь понять, как сделать зацикленное аудио с функцией включения / выключения, касаясь узла. Я подумал, что лучший способ реализовать это через SKAudioNode, но я не уверен, что я делаю неправильно в следующем коде. При нажатии на узле - SKAudioNode начинает играть, а затем, после нажатия, чтобы выключить звук - звук не останавливается. При нажатии в другой раз - звук перекрывает предыдущий. Положить здесь всю существенную часть. Заранее спасибо.

import SpriteKit
import AVFoundation

Я создаю здесь логическое значение для запуска, если звук включен или выключен:

var firesoundon = false

Настройка сцены следующая.

class GameScene2: SKScene {

    override func didMoveToView(view: SKView) {
    setUpScenery()    
}


private func setUpScenery() {


    //BACKGROUND
    let background = SKSpriteNode(imageNamed: backgroundImage, normalMapped: true)
    background.anchorPoint = CGPointMake(0, 0)
    background.position = CGPointMake(0, 0)
    background.zPosition = Layer.ZBackground
    background.size = CGSize(width: self.view!.bounds.size.width, height: self.view!.bounds.size.height)
    background.lightingBitMask = 1;
    addChild(background)


    //FIRE

    let fireLayerTexture = SKTexture(imageNamed: fireImage)
    let fireLayer = SKSpriteNode(texture: fireLayerTexture)

    fireLayer.anchorPoint = CGPointMake(1, 0)
    fireLayer.position = CGPointMake(size.width, 0)
    fireLayer.zPosition = Layer.Z4st        
    addChild(fireLayer)

    let firePath = UIBezierPath()
    firePath.moveToPoint(CGPointMake(0, 0))
    firePath.addCurveToPoint(CGPointMake(115, 215), controlPoint1: CGPointMake(5, 170), controlPoint2: CGPointMake(90, 190))
    firePath.addCurveToPoint(CGPointMake(150, 260), controlPoint1: CGPointMake(115, 215), controlPoint2: CGPointMake(120, 295)) //curve1
    firePath.addCurveToPoint(CGPointMake(180, 280), controlPoint1: CGPointMake(150, 260), controlPoint2: CGPointMake(155, 350)) //curve2
    firePath.addCurveToPoint(CGPointMake(225, 280), controlPoint1: CGPointMake(180, 280), controlPoint2: CGPointMake(210, 395)) //curve3
    firePath.addCurveToPoint(CGPointMake(250, 260), controlPoint1: CGPointMake(230, 280), controlPoint2: CGPointMake(245, 290)) //curve4
    firePath.addCurveToPoint(CGPointMake(290, 220), controlPoint1: CGPointMake(250, 260), controlPoint2: CGPointMake(280, 270)) //curve5
    firePath.addLineToPoint(CGPointMake(380, 200))
    firePath.addLineToPoint(CGPointMake(380, 0))
    firePath.addLineToPoint(CGPointMake(0, 0))
    let fireNode = SKShapeNode(path: firePath.CGPath, centered: false)
    fireNode.alpha = 0.2
    fireNode.zPosition = Layer.Z4st+1
    fireNode.lineWidth = 2
    fireNode.strokeColor = SKColor.whiteColor()
    fireNode.fillColor = SKColor.blueColor()
    fireNode.position = CGPointMake(size.width/2, 0)
    fireNode.name = "fireNode"

    self.addChild(fireNode)

Создание функции включения / выключения огня:

func fireTurnsOnOff () {

    let playguitar: SKAudioNode
    playguitar = SKAudioNode(fileNamed: "guitar.wav")   

    if firesoundon == false {

        addChild(playguitar)

        firesoundon = true
        print("firesoundon is == \(firesoundon)")              
    }

    else if firesoundon == true {

        let stopguitar = SKAction.stop()
        playguitar.runAction(stopguitar)
        print("GuiterStopped")

        firesoundon = false
        print("firesoundon is == \(firesoundon)")            
    }       
}



override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch in touches {

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

      if node.name == "fireNode" {
          fireTurnsOnOff()
        }

     }
}

1 ответ

Решение

Каждый раз, когда вы нажимаете кнопку звука, вы создаете новый экземпляр SKAudioNode, который, вероятно, вызывает проблемы со звуком.

Возьмите тезисы в две строки

let playguitar: SKAudioNode
playguitar = SKAudioNode(fileNamed: "guitar.wav")   

снаружи

 func fireTurnsOnOff() {...

Чем поставить

  let playguitar: SKAudioNode

выше DidMoveToView как класс / глобальное свойство и

  playguitar = SKAudioNode(fileNamed: "guitar.wav")  

внутри didMoveToView.

Другие вопросы по тегам