2014-05-16 53 views
2

我有几个级别都使用相同的声音效果。我没有在每个级别上使用相同的代码,而是将所有声音合并到一个单例类中。然而,当我从其他类运行该方法时,将它放入单例中不会播放声音。我没有错误或警告。SKAction playSoundFileNamed从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]; 

回答

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。

+2

太棒了。完美工作,并特别感谢在mp3问题上的负责人。我并不知道这个限制。 Dankeschön! – sangony