2009-07-18 9 views
0

Je voudrais avoir un réglage pour désactiver tous les sons provenant de mon programme. Je sais que je peux définir un ivar global et écrire des instructions if pour chaque son mais j'espérais qu'il y avait quelque chose que je pourrais définir dans l'appdelegate pour désactiver tous les sons du programme.Désactiver tous les sons du programme

J'ai joué à quelques jeux qui vous permettent d'éteindre les sons du jeu. J'utilise AVAudioPlayer pour les clips plus longs et les sons de base du système de service audio pour les clips courts.

Répondre

0

Qu'est-ce que vous utilisez pour jouer des sons? Je pense que vous pouvez désactiver les sons en désactivant la session audio - voir AudioSessionSetActive.


Mise à jour: Oui, vous avez raison. J'ai juste essayé de désactiver la session audio et les sons semblaient continuer. Ça ne fait rien. Vous pouvez utiliser l'approche du drapeau booléen, et il n'est pas nécessaire d'avoir une condition autour de chaque son. La façon dont je fais SFX dans mon jeu est à travers une classe séparée, une sorte de «vue» qui observe le modèle et crée des sons pour divers événements de jeu. De cette façon, vous gardez une séparation nette des problèmes dans la conception et lorsque vous souhaitez désactiver les sons, vous déconnectez simplement la classe de son du modèle. Le code ressemble un peu à ceci:

@implementation Model 

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

@end 

Et la vue sonore:

@implementation SFX 

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

@end 

Bien sûr, vous devez mettre en œuvre la partie observation réelle. Vous pouvez utiliser NSNotificationCenter ou écrire votre propre code dispatching en utilisant un tableau d'observateurs:

@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 

La vue SFX est connecté au modèle:

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

Lorsque vous souhaitez désactiver tous les sons, il vous suffit de déconnexion le SFX du modèle; arrête d'observer. Si les sons sont désactivés avant le début du jeu, vous n'avez même pas à allouer la classe SFX, ce qui économise du temps, de la performance et de la mémoire.

+0

Lisez la documentation à ce sujet et cela convient mieux à la définition de la priorité audio. Je n'arrive pas à comprendre comment je pourrais l'utiliser dans mon application. – Aaron

Questions connexes