我有几个级别都使用相同的音效。我没有在每个级别都使用相同的代码,而是将所有声音合并到一个单例类中。但是,当我从其他类运行该方法时,将其放在单例中不会播放声音。我没有任何错误或警告。
当我在每个类中都有相同的代码时,我播放声音没有问题。
问题: Does 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];
您的单例可能不在节点层次结构中(即不是场景的子级或孙级等)。因此您无法对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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)