AVAudioPlayer вызывает SpriteNodes рывок при анимации

Я работаю над App atm, где пользователь видит узлы, анимирующие по экрану. Когда узел проходит определенную целевую область, пользователь должен нажать кнопку, а затем будет воспроизводиться звук avplayer.

Проблема в том, что каждый раз, когда пользователь нажимает кнопку и звук воспроизводится, узлы все дергаются, и я не знаю, почему. Чтобы повторить проблему, которую я имею, вот пример проекта, который я собрал в несколько минут.

import SpriteKit
class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let skView = self.view as! SKView

        let scene = GameScene(size: CGSizeMake(self.view.frame.size.width, self.view.frame.size.height))

        skView.presentScene(scene)
    }
}

import SpriteKit
import AVFoundation
class GameScene: SKScene {

    var buttonNode : SKSpriteNode?

    override init(size: CGSize)
    {
        super.init(size: size)

        self.backgroundColor = SKColor.whiteColor()
        self.view?.backgroundColor = UIColor.whiteColor()
    }

    override func didMoveToView(view: SKView)
    {
        buttonNode = SKSpriteNode(imageNamed: "button")
        buttonNode?.name = "button"
        buttonNode?.position = CGPointMake(200, 200)
        buttonNode?.size = CGSizeMake(150, 150)
        self.addChild(buttonNode!)

       NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: #selector(self.animateNodes), userInfo: nil, repeats: true)
    }

    var avPlayer : AVAudioPlayer?
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
    {
        for touch in touches
        {
            let viewTouchLocation = touch.locationInView(self.view)
            let sceneTouchPoint = self.convertPointFromView(viewTouchLocation)
            let touchedNode = self.nodeAtPoint(sceneTouchPoint)
            if(touchedNode.name == "button")
            {
                let avURL = NSURL.fileURLWithPath(NSBundle.mainBundle().pathForResource("exampleSound", ofType: "wav")!)
                avPlayer = try? AVAudioPlayer(contentsOfURL: avURL)
                avPlayer?.volume = 0.2
                avPlayer?.play()
            }
        }
    }

    func animateNodes()
    {
        let sprite = SKSpriteNode(imageNamed: "shortMetalWhite")
        sprite.color = UIColor.blackColor()
        sprite.colorBlendFactor = 1.0
        sprite.position = CGPointMake(self.view!.frame.size.width, 400)

        self.addChild(sprite)
        let noteDuration = 4.0
        let actionMove = SKAction.moveTo(CGPointMake(-5, 400), duration: noteDuration)
        let actionMoveDone = SKAction.removeFromParent()
        sprite.runAction(SKAction.sequence([actionMove, actionMoveDone]))
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Кто-нибудь знает, чем это вызвано? Что-то не так с узлами sprite и avplayer, что вызывает это? Я повторил этот же код в приложении, не игра, где у вас есть ряд UIViews анимации по экрану и звук играет каждый раз, когда вы нажимаете кнопку, и нет никаких проблем с какой-либо задержки или рывков. Так что же в узлах sprite и AVPlayer вызывает эту проблему?

(Кстати проблема не так заметна на симуляторе, но когда вы запускаете его на любом iPhone или iPad, это очень заметно)

Любая помощь была бы очень признательна

Редактировать:

Если я переключаюсь на использование аудиосервисов вместо этого, как это

if let soundURL = NSBundle.mainBundle().URLForResource("OHH10 Drums1DOTcom", withExtension: "wav") {
                    var mySound: SystemSoundID = 0
                    AudioServicesCreateSystemSoundID(soundURL, &mySound)
                    // Play
                    AudioServicesPlaySystemSound(mySound);
                }

нет запаздывания,но тогда я не контролирую громкость. Так что не идеальное решение

1 ответ

  1. После делать больше исследования, кажется своей проблемой с AVAudioPlayer, оно не действительно одет для игры повторяя звуковых эффектов в короткой последовательности.

    Поэтому вместо этого я переключился на использование

    SKAction.playSoundFileNamed("example.wav", waitForCompletion: false)
    

    Опять же проблема с этим заключается в том, что он не позволяет контролировать громкость. Это означает, что я должен был открыть audacity и изменить громкость каждого звукового файла, чтобы получить его правильно.

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