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