2016-07-15 58 views
0

我正在创建一个游戏,用户使用jetpack控制角色。当喷气背包与钻石相交时,我会将钻石加入其中,然后发出声音。然而,声音会让游戏暂停十分之一秒左右并扰乱游戏流程。这是我使用的代码:AVAudioPlayer播放时游戏滞后

var diamondSound = NSBundle.mainBundle().URLForResource("diamondCollect", withExtension: "wav")! 
var diamondPlayer = AVAudioPlayer?() 

    class GameScene: SKScene{ 

     override func didMoveToView(view: SKView) { 

      do { 
       diamondPlayer = try AVAudioPlayer(contentsOfURL: diamondSound) 
       guard let player = diamondPlayer else { return } 

       player.prepareToPlay() 
      } catch let error as NSError { 
       print(error.description) 
      } 
     } 

再后来:

override func update(currentTime: CFTimeInterval) { 

     if character.intersectsNode(diamond){ 
      diamondPlayer?.play() 
      addDiamond() 
      diamond.removeFromParent() 
     } 

    } 

而且我使用雪碧套件,如果该事项。任何帮助是极大的赞赏!

+0

我会尝试使用'SKAudioNode'或'SKAction.playSoundWithFileNamed'第一,因为他们在建造时,是与SpriteKit一起使用。此外,由于您正在尝试捕捉,因此您不需要警惕,我会将其删除。如果从AVAudioPlayer返回一个零,它会触发捕获 – Knight0fDragon

+0

我看到的问题是,你可能会多次发射播放,添加一个检查只播放一次,AVAudioPlayer有一个“玩”布尔值,你可以检查 – Knight0fDragon

+0

只是因为你从父母中删除钻石,并不意味着钻石已经死亡,即使钻石不在现场,你的相交节点仍然会通过 – Knight0fDragon

回答

0

通常,我喜欢在我的游戏中使用SKAction.playSoundWithFile,但是这个有限制,没有音量设置。 所以,白衣这个扩展就可以解决这个不足:

public extension SKAction { 
    public class func playSoundFileNamed(fileName: String, atVolume: Float, waitForCompletion: Bool) -> SKAction { 

    let nameOnly = (fileName as NSString).stringByDeletingPathExtension 
    let fileExt = (fileName as NSString).pathExtension 

    let soundPath = NSBundle.mainBundle().URLForResource(nameOnly, withExtension: fileExt) 


    var player: AVAudioPlayer! = AVAudioPlayer() 
    do { player = try AVAudioPlayer(contentsOfURL: soundPath!, fileTypeHint: nil) } 
    catch let error as NSError { print(error.description) } 

    player.volume = atVolume 

    let playAction: SKAction = SKAction.runBlock {() -> Void in 
     player.prepareToPlay() 
     player.play() 
    } 

    if(waitForCompletion){ 
     let waitAction = SKAction.waitForDuration(player.duration) 
     let groupAction: SKAction = SKAction.group([playAction, waitAction]) 
     return groupAction 
    } 

    return playAction 
    } 
} 

使用

self.runAction(SKAction.playSoundFileNamed("diamondCollect.wav", atVolume:0.5, waitForCompletion: true)) 
+0

为什么你会经历这个麻烦,像我在评论中提到的那样使用SKAudioNode。你的方法存在很多问题(与OP相同,这就是为什么我告诉他切换)其中之一是如果你暂停精灵,你的音频仍然会播放 – Knight0fDragon

+0

这不是一个麻烦,这是一个问题您可以使用多种方法(例如SKTAudio库)。首先,对于OP问题没有滞后的答案,其次你必须区分背景音乐和效果之间的音频。显然,扩展不能做你的游戏的音频管理器。保持玩家参考和不止一名球员是好事。一个动作不仅可以从所涉及的精灵中启动。这种方法可以用于很少的效果不能合理地不需要暂停,否则你可以改进它以启用暂停,如果你想。 –

+0

有滞后,你的音频没有准备好,直到发生跑块为止,它可能不会延迟游戏,但音频本身会被延迟。我的观点是你正在创建一个SKAudioNode所做的扩展,但效果很差。 SKAudioNodes可以表现得几乎与动作一样,但是不是添加一个动作到一个节点,而是添加一个孩子。这就是它的缺点,你可以拿这个免费的水桶来获得你的水,或者您可以使用自己的资源来构建自己的存储桶并冒险发现漏洞,因为您可能错过了一个步骤 – Knight0fDragon