2014-04-18 32 views
1

我正在用SpriteKit構建我的第一個項目,但我無法弄清楚這部分。SpriteKit - 當敵人死亡時如何阻止聲音

我的項目包括敵方直升機飛入屏幕。每個敵人在14秒左右播放一個聲音文件。這不是一個循環。它包括敵人在進入屏幕前接近的聲音以及在屏幕上移動時的更多聲音fx。問題是,當我殺死其中一架直升機時,即使敵方直升機節點已從現場撤離,聲音也會繼續播放。

我嘗試過使用playSoundFileNamed動作,但我知道那些無法停止。

我試過使用SoundManager但是因爲所有的敵人都有相同的文件ID,所以如果我停下來,它會停止所有的人,即使是在屏幕上。

我讀過我應該使用OpenAL,但我找不到解釋如何在播放每個聲音時添加某種ID以瞭解停止哪個聲音的源代碼。

與AVAudioPlayer相同。我試圖爲每個敵人創建一個玩家,但由於某種原因,runBlock SKAction只是忽略了這個代碼,並且從來不會播放聲音。奇怪的。我還認爲AVAudioPlayer比處理聲音效果更適合播放背景音樂。

有沒有某種聲音引擎可以幫助解決這個問題?

+1

AVAudioPlayer做工精細,使用它。 – Roecrew

+0

我現在嘗試使用AVAudioPlayer,並且能夠播放聲音,甚至可以將所有玩家(每個敵人一個)放在一個陣列中,以便我可以暫停它們。問題在於,當敵人從場景中移出時,聲音仍在繼續播放。我嘗試在檢測到聯繫人時刪除節點使用removeAllActions啓動的所有操作(其中包括AVAudioPlayer操作),但仍不起作用。聲音繼續播放。不知道我做錯了什麼。 – Drowned

+1

發佈與聲音問題相關的代碼。您使用AVAudioPlayer並將每個實例保存在一個數組中,似乎都是正確的。所以問題必須出現在代碼的某個部分。 – sangony

回答

0

我能解決它,讓所有的音頻播放器保持在一個陣列中。這裏的代碼:

首先你創建一個NSMutableArray來跟蹤所有玩家(稱之爲'playerArray')。然後,每個SKSpriteNode得到它自己的球員時,他們添加到場景:

NSError *error; 
NSURL * backgroundSound = [[NSBundle mainBundle] URLForResource:@"coptersound" withExtension:@"mp3"]; 
AVAudioPlayer *copterPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundSound error:&error]; 
copterPlayer.numberOfLoops = 1; 
copterPlayer.delegate = self; 
[copterPlayer prepareToPlay]; 

SKAction *moveCopter = [SKAction moveToX:(-10 - enemy.size.width) duration:14]; 
SKAction *copterSound = [SKAction runBlock:^{ 

    [playerArray addObject:copterPlayer]; 
    [copterPlayer play]; 

    [enemy.userData setValue:copterPlayer forKeyPath:@"player"]; 

}]; 

SKAction *moveGroup = [SKAction group:@[copterSound, moveCopter]]; 

檢測到碰撞時,那麼,這就是我停止播放器:

[[enemy.userData objectForKey:@"player"] stop]; 
    [playerArray removeObject:[enemy.userData objectForKey:@"player"]]; 

需要暫停所有玩家?這樣做:

for(AVAudioPlayer *a in playerArray) { 
     [a pause]; 
    } 

而且不要忘記刪除所有已完成了從使用該陣列打球員:如果

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag { 
    [playerArray removeObject:player]; 
} 

不知道這是最好的方式,但它完美的作品。由於這是我第一次使用SpriteKit,因此仍然打開更好的建議。

0

playSoundWithFile可以停止,添加子SKNode到你的直升機,玩你的孩子的聲音,然後就暫停孩子