SKAction playSoundFileNamed из Синглтона


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

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

Вопрос: не работает ли 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];
1 2

1 ответ:

Ваш синглтон, вероятно, не входит в иерархию узлов (т. е. не является ребенком или внуком и т. д. сцены). Следовательно, вы не можете выполнять какие-либо действия на self, так как экземпляр singleton не будет получать регулярные обновления от 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 за один раз в аппаратном обеспечении, остальное делает процессор. Лучше всего подходят форматы для коротких звуковых эффектов .КАФ И.wav.