Отключить все звуки программы - PullRequest
0 голосов
/ 18 июля 2009

Я хотел бы иметь настройку для отключения всех звуков, исходящих из моей программы. Я знаю, что могу установить глобальный ivar и написать операторы if для каждого звука, но я надеялся, что в appdelegate можно было что-то установить, чтобы отключить все звуки программы.

Я сыграл пару игр, которые позволяют отключить звуки игры.

Я использую AVAudioPlayer для более длинных клипов и базовые звуки системы Audio Service для коротких клипов.

1 Ответ

0 голосов
/ 18 июля 2009

Что вы используете для воспроизведения звуков? Я думаю, что вы могли бы отключить звуки, отключив аудио сеанс - см. 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 - это экономит время, производительность и память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...