我有几个级别都使用相同的声音效果。我没有在每个级别使用相同的代码,而是将所有声音合并为单个类。但是,当我从其他类中运行该方法时,将它放在单例中没有播放声音。我没有错误或警告。
当我在每个班级中使用相同的代码时,播放声音没有问题。
问题:从单身人士调用时,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];
答案 0 :(得分: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。