来自Singleton的SKAction playSoundFileNamed

san*_*ony 2 singleton sprite-kit skaction

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

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

问题:SKAction playSoundFileNamed从单例调用时是不起作用还是我的代码丢失了什么?

我的单例头文件......

-(void)soundSwordWhoosh;
Run Code Online (Sandbox Code Playgroud)

我的单例方法文件......

@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];
}
Run Code Online (Sandbox Code Playgroud)

然后我调用这样的方法:

[_animations soundSwordWhoosh];
Run Code Online (Sandbox Code Playgroud)

Lea*_*s2D 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
Run Code Online (Sandbox Code Playgroud)

如果你担心"缓存"这个动作,就不值得去做.你会做很多其他影响性能的事情.除了Sprite Kit在内部创建每个操作的副本,无论您是创建新的还是Sprite Kit副本,它都不会有太大变化.static如果你愿意的话,你仍然可以将它缓存在变量中.

您可以从任何节点和任何方法调用这样的帮助器方法(不要忘记#import "SoundHelper.h"):

-(void) someNodeMethod
{
    [SoundHelper playSwordSoundWithNode:self];
}
Run Code Online (Sandbox Code Playgroud)

PS:你不应该使用.mp3文件来获得音效,因为效率很低.iOS硬件一次只能在硬件中解码一个mp3,其余的由CPU完成.更适合短音效的格式是.caf和.wav.

  • 真棒.工作得很完美,特别感谢你对mp3问题的关注.我没有意识到这个限制.Dankechön! (2认同)