2016-05-23 17 views
0

Ich arbeite an App atm, wo der Benutzer Knoten über den Bildschirm animiert sieht. Wenn der Knoten einen bestimmten Zielbereich passiert, muss der Benutzer einen Knopf drücken und dann wird ein AV-Player-Sound abgespielt.AVAudioPlayer bewirkt, dass SpriteNodes beim Animieren ruckelt

Das Problem ist, immer wenn der Benutzer die Taste drückt und der Sound spielt, die Knoten alle Jerk und ich habe keine Ahnung warum. Um das Problem, das ich habe, zu replizieren, hier ist ein Beispielprojekt, das ich in wenigen Minuten zusammengestellt habe.

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") 
    } 
} 

Hat jemand eine Idee, was das verursacht? Stimmt etwas mit Sprite Nodes und Avplayer nicht? Ich habe den gleichen Code in einer Nicht-Spiel-App repliziert, wo eine Reihe von UIViews über den Bildschirm animiert wird und ein Sound jedes Mal abgespielt wird, wenn Sie eine Taste drücken. Es gibt kein Problem mit Verzögerungen oder Ruckeln. Woran liegt das an Sprite Nodes und AVPlayer, die dieses Problem verursachen?

(BTW ist das Problem nicht so auffällig auf dem Simulator, aber wenn man es auf jedem iPhone oder iPad laufen, ist es sehr auffällig)

Jede Hilfe viel

bearbeiten würde geschätzt:

Wenn ich tauschen zu Audioservices statt wie diese

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

gibt keine Verzögerung, aber dann habe ich keine Kontrolle über die Lautstärke. Also keine ideale Lösung

Antwort

0

Nach mehr Nachforschungen scheint es ein Problem mit AVAudioPlayer zu sein, es ist nicht wirklich geeignet für wiederholte Wiederholungen von Soundeffekten.

Anstatt also tauschte ich

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

Wieder Problem mit dabei ist, dass es nicht erlaubt, die Lautstärke zu steuern. Das bedeutet, dass ich die Dreistigkeit öffnen musste und die Lautstärke jeder Audiodatei so anpassen musste, dass sie genau richtig war.

Ich hätte eine bessere Lösung bevorzugt, aber leider ist dies das Beste, was ich finden kann, wenn ich keine Spielverzögerung vermeiden möchte

Verwandte Themen