2016-03-01 2 views
1

Я хочу иметь звук при щелчке узла. в настоящее время код:звук не воспроизводится, когда узел коснулся spritekit swift

let sndButtonClick = SKAction.playSoundFileNamed("button_click.wav", waitForCompletion: false) 

и от прикосновений начал свою

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


    for touches: AnyObject in touches { 


     let location = touches.locationInNode(self) 
     if playButton.containsPoint(location) { 
      playButton.runAction(sndButtonClick) 
      playButton.removeFromParent() 

      let nextScene = GamePlayMode(size: self.scene!.size) 
      nextScene.scaleMode = self.scaleMode 
      self.view?.presentScene(nextScene) 
     } 
} 

я сделал ту же самую вещь для столкновения двух узлов в gameplaymode и он работает, но в главном меню не работает !

Я попытался

self.runAction(sndButtonClick) 

затем

playbutton.runAction(sndButtonClick) 

как не работали

+1

Я подозреваю, что ваша проблема связана со следующей строкой; 'PlayButton.removeFromParent'. Это удалит узел и отменит его действия. В качестве эксперимента измените «waitForCompletion» игры на «true». –

+0

@PriceRingo waitForCompletion означает, что продолжительность действия будет такой же, как длина воспроизведения звука, но все же действие не будет выполнено из-за того, как работает метод runAction. Я описал это в своем ответе. – Whirlwind

ответ

3

Почему работает звук действия на кнопке не работает?

Это из документации:

SKAction объект представляет собой действие, которое выполняется узлом в сцены (SKScene) ... Когда сцена обрабатывает свои узлы, действия, связанные с теми, узлы оцениваются.

Средства действия для узла будет работать только если узел добавляется к сцене. Так что это не имеет никакого эффекта:

playButton.runAction(sndButtonClick) 
playButton.removeFromParent() 

потому, что вы удалили кнопку со сцены, и он не будет присутствовать в следующем кадре, когда действия должны быть выполнены. Вот как runAction метод работает:

Добавляет действие в список действий, выполняемых в узле ... Новое действие обрабатывается в следующий раз цикл анимации сцены обрабатывается.

Кроме того, поскольку вы сразу же вызова presentScene не будет никакого следующего кадра в любом случае, так что даже если вы удалите removeFromParent заявление, звук не будет работать, потому что нет следующего кадра.

Почему запуск звукового воздействия на сцену не работает?

self.runAction(sndButtonClick) не работает, потому что вы делаете переход немедленно, не дожидаясь следующего кадра, в котором будут выполняться очередные действия (как описано выше).

решение проблемы

Для воспроизведения звука до перехода, вы должны ждать следующего кадра, и вы можете сделать что-то вроде:

runAction(sndButtonClick, completion: { 
    self.view?.presentScene(nextScene) 
}) 

или

let block = SKAction.runBlock({ 
    self.view?.presentScene(nextScene) 
}) 

runAction(SKAction.sequence([sndButtonClick, block])) 

Предотвращение утечек:

Рассмотрите возможность использования списка захвата внутри блока, который захватывает себя, чтобы избежать возможных сильных опорных циклов, когда это необходимо, например:

let block = SKAction.runBlock({ 
    [unowned self] in 
    //use self here 
}) 

В данном случае вашего, это должно быть безопасно ходить без списка захвата, потому что сцена не имеет сильной ссылки на блок. Только блок имеет сильную ссылку на сцену, но после того, как блок выполнен, потому что ничто не сохраняет его (нет сильных ссылок на него), он будет выпущен, таким образом, сцена может быть выпущена правильно. Но, если блок был объявлен как свойство, или действие, выполняющее блок, выполнялось бесконечно (используя метод repeateActionForever, чтобы повторить определенную последовательность), тогда у вас наверняка будет утечка.

Вы всегда должны переоценивать действие сцены, чтобы увидеть, что происходит (если оно не вызывается, что-то удерживает сцену и вызывает утечку).

+0

Большое вам спасибо за информативный ответ! задача решена! – prival

+1

@prival Без проблем :) Рад помочь. В качестве дополнения, если у вас была сцена с переходом, у которого есть задержка до фактического перехода, например. 'view? .presentScene (nextScene, переход: SKTransition.fadeWithDuration (someDuration)), звук будет работать. Конечно, до тех пор, пока вы запускаете звуковое действие на самой сцене или на узле, который добавлен в сцену. – Whirlwind

Смежные вопросы