2

我有几个级别都使用相同的音效。我没有在每个级别都使用相同的代码,而是将所有声音合并到一个单例类中。但是,当我从其他类运行该方法时,将它放在一个单例中不会播放任何声音。我没有错误或警告。

当我在每个班级都有相同的代码时,播放声音没有问题。

问题:从单例调用时不起作用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];
4

1 回答 1

7

您的单例可能不在节点层次结构中(即不是场景的子或孙等)。因此,您无法运行任何操作,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,其余的由CPU完成。更适合短音效的格式是 .caf 和 .wav。

于 2014-05-16T14:43:33.330 回答