2009-07-18 86 views
0

我想要設置禁用來自我的程序的所有聲音。我知道我可以設置一個全球伊娃,並寫每個聲音的聲明,但我希望有一些東西,我可以在appdelegate設置禁用所有程序的聲音。禁用所有程序的聲音

我玩過幾款遊戲,可以讓您關閉遊戲聲音。

我正在使用AVAudioPlayer獲得較長的剪輯和短片段的基本音頻服務系統聲音。

回答

0

你用什麼來播放聲音?我認爲您可以通過停用音頻會話來禁用聲音 - 請參閱AudioSessionSetActive


更新:是的,你說得對。我剛剛嘗試停用音頻會話,並且聲音似乎繼續。沒關係。你可以使用布爾標誌方法,並且不需要在每個聲音周圍都有條件。我在遊戲中做SFX的方式是通過一個單獨的課程,一種觀察模型併爲各種遊戲事件創建聲音的「視圖」。通過這種方式,您可以在設計中保持清晰的關注點,並且當您想要關閉聲音時,只需將聲音類與模型斷開即可。代碼看起來有點像這樣:

@implementation Model 

- (void) stepBy: (double) seconds 
{ 
    [player doSomething]; 
    if (player.isDead) 
     [self sendNotification:@selector(playerHasDied:) withObject:player]; 
} 

@end 

和聲音的看法:

@implementation SFX 

- (void) playerHasDied: (id) player 
{ 
    [aarghSound play]; 
} 

@end 

當然,你必須執行的實際觀察的部分。你可以使用NSNotificationCenter或使用觀察員組成的陣列編寫自己的調度代碼:

@implementation Model 

- (void) addObserver: (id) object 
{ 
    [observers addObject:object]; 
} 

- (void) sendNotification: (SEL) message 
{ 
    for (id observer in observers) 
     if ([observer respondsToSelector:message]) 
      [observer performSelector:message]; 
} 

@end 

的SFX視圖連接到模型:

Model *model = [[Model alloc] init]; 
SFX *sounds = [[SFX alloc] init]; 
[model addObserver:sounds]; 

當你想關閉所有聲音,你只是斷開模型中的SFX;停止觀察。如果在遊戲開始之前聲音被禁用,您甚至不必分配SFX類 - 這可以節省時間,性能和內存。

+0

請閱讀有關此文檔,它與設置音頻優先級更相關。我無法弄清楚如何在應用程序中使用它。 – Aaron 2009-07-21 00:41:23