gpt4 book ai didi

singleton - SKAction playSoundFileNamed from Singleton

转载 作者:行者123 更新时间:2023-12-02 07:29:24 34 4
gpt4 key购买 nike

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

当我在每个类中使用相同的代码时,我可以毫无问题地播放声音。

问题: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 内部为每个 Action 创建一个副本之外,无论您是创建一个新 Action 还是 Sprite Kit 副本,它都不会有太大变化。如果您愿意,您仍然可以将其缓存在 static 变量中。

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

-(void) someNodeMethod
{
[SoundHelper playSwordSoundWithNode:self];
}

PS:您不应该使用 .mp3 文件作为音效,因为它非常低效。 iOS 硬件在硬件上一次只能解码一个 mp3,其余由 CPU 完成。更适合短音效的格式是 .caf 和 .wav。

关于singleton - SKAction playSoundFileNamed from Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23697478/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com