SKAAction playSoundFileНазвание от Singleton

У меня есть несколько уровней, использующих одни и те же звуковые эффекты. Вместо того, чтобы иметь один и тот же код на каждом уровне, я объединил все звуки в один класс. Однако, имея его в синглтоне, звук не воспроизводится, когда я запускаю метод из других классов. У меня нет ошибок или предупреждений.

Когда у меня один и тот же код в каждом классе, у меня нет проблем с воспроизведением звука.

Вопрос. SKAction playSoundFileNamed не работает при вызове из синглтона или в моем коде чего-то не хватает?

Мой заголовочный файл синглтона...

-(void)soundSwordWhoosh;

Мой файл одноэлементных методов...

@implementation Animations{
    SKAction *swordWhooshSound;
}

-(id)init {
    self = [super init];
    if (self)
    {
        swordWhooshSound = [SKAction playSoundFileNamed:@"SwordWhoosh.mp3" waitForCompletion:YES];
    }
return self;
}

-(void)soundSwordWhoosh {
[self runAction:swordWhooshSound];
}

Затем я вызываю метод следующим образом:

[_animations soundSwordWhoosh];

person sangony    schedule 16.05.2014    source источник


Ответы (1)


Ваш синглтон, вероятно, не находится в иерархии узлов (т.е. не является дочерним элементом или внуком и т. д. сцены). Следовательно, вы не можете выполнять какие-либо действия на self, так как экземпляр синглтона не будет получать регулярные обновления от Sprite Kit.

Здесь также нет необходимости использовать синглтон, потому что вы можете сделать то же самое проще, используя методы класса. Вам просто нужно передать узел, для которого должен воспроизводиться звук.

Вот пример вспомогательного класса:

@interface SoundHelper
+(void) playSwordSoundWithNode:(SKNode*)node;
@end

@implementation SoundHelper
+(void) playSwordSoundWithNode:(SKNode*)node
{
    [node runAction:[SKAction playSoundFileNamed:@"SwordWhoosh.mp3" waitForCompletion:YES]];
}
@end

Если вы беспокоитесь о «кэшировании» действия, не стоит этого делать. Вы будете делать множество других вещей, которые гораздо больше влияют на производительность. Кроме того, Sprite Kit внутренне создает копию каждого действия, независимо от того, создаете ли вы новое действие или копируете Sprite Kit, это не должно сильно меняться. Тем не менее, вы можете кэшировать его в static переменных, если хотите.

Вы можете вызывать вспомогательные методы таким образом из любого узла и любого метода (не забудьте #import "SoundHelper.h"):

-(void) someNodeMethod
{
    [SoundHelper playSwordSoundWithNode:self];
}

PS: вы не должны использовать файлы .mp3 для звуковых эффектов, так как это крайне неэффективно. Аппаратное обеспечение iOS может аппаратно декодировать только один mp3 за раз, остальное делает процессор. Для коротких звуковых эффектов лучше подходят форматы .caf и .wav.

person LearnCocos2D    schedule 16.05.2014
comment
Потрясающий. Сработало отлично и отдельное спасибо за внимание к проблеме с мп3. Я не знал об этом ограничении. Данке шён! - person sangony; 16.05.2014