为啥我的音频会在 Sprite Kit 场景转换之前播放?

Posted

技术标签:

【中文标题】为啥我的音频会在 Sprite Kit 场景转换之前播放?【英文标题】:Why does my audio play before the Sprite Kit scene transition?为什么我的音频会在 Sprite Kit 场景转换之前播放? 【发布时间】:2014-08-23 01:22:12 【问题描述】:

在这段代码中,Audio 是一个处理与AVAudioPlayer 相关的所有事情的类。目前有一些音乐正在播放。我想让它在 1 秒内完全淡出,然后播放另一首歌。同时,我想要一个新的场景出现。所以我希望新歌在过渡(也持续 1 秒)结束时立即开始。然而,我发现自己总是在场景转换开始之前等待音乐停止。我尝试了很多方法,有和没有选择器,有和没有各种睡眠功能,但没有任何运气。我也尝试过使用stopMusic 而不是transitionMusic,然后在新场景中使用playMusic:,但我总是发现自己在等待stopMusic 在过渡开始之前完成。

这是第一个场景的一部分,如果按下屏幕上的某个按钮,就会运行:

Audio *musicPlayer = [[Audio alloc] init];
NewScene *newScene = [NewScene sceneWithSize:self.size];
SKTransition *reveal = [SKTransition pushWithDirection:SKTransitionDirectionLeft duration:1.0];
reveal.pausesOutgoingScene = NO;
reveal.pausesIncomingScene = NO;
[self.view presentScene:newScene transition:reveal];
[musicPlayer transitionMusic:@"NewSong"];

方法transitionMusic:如下:

-(void)transitionMusic:(NSString *)fileName 
    [self performSelectorOnMainThread:@selector(stopMusic) withObject:nil waitUntilDone:YES];
    [self playMusic:fileName];

stopMusicplayMusic: 是:

-(void)stopMusic 
    while(BGM.volume > 0.05)      
        [BGM setVolume:(BGM.volume - 0.05)];
        [NSThread sleepForTimeInterval:0.05];   
    
    [BGM stop];    


-(void)playMusic:(NSString *)fileName     
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",fileName] withExtension:@"caf"];
    BGM = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:nil];
    [BGM setNumberOfLoops:-1];
    [BGM setVolume:1.0];
    [BGM prepareToPlay];
    [BGM play];   

另外,BGM 是在Audio.h 中声明的静态音频播放器。谁能指出我做错了什么?

【问题讨论】:

您可能想要做一个更简单的过渡,并在 didMoveToView 中进行淡入并在 runAction 调用中一起开始音乐。 @uchuugaka:自从你发表评论后,我编辑了我的帖子。我已经试过了。 【参考方案1】:

您的 musicPlayer 播放器对象依赖于您的旧场景。您需要创建一个单例来独立处理从一个场景到另一个场景的过渡音乐。

BoxesOfBabies.com 有一个很好的教程,介绍如何设置单例并将其用于Control Music Across Multiple SKScene。

编辑:

在您的 SKScene 中:

#import "MySingleton"

@implementation MainScene

    MySingleton *_mySingleton;

在你的初始化方法中:

_mySingleton = [MySingleton sharedInstance];

要开始在您的任何场景中播放音频:

[_mySingleton startPlayingSong1];

[_mySingleton startPlayingSong2];

你的单例中有什么方法。

【讨论】:

它必须是NSObject 的子类吗?现在我有Audio 类,但它是AVAudioPlayer 的子类。 @Deeyennay - NSObject 是大多数 Objective-C 类层次结构的根类。您几乎可以从任何班级获得单身人士。我目前正在使用 SKSpriteNode 单例。 我已经实现了,但我仍然需要等待音乐完全淡出,新音乐开始,然后才能开始过渡。我试过在旧场景中使用stopMusic,在新场景中使用playMusic:,但没有任何改变。 @Deeyennay - 你熟悉单身人士吗? 没那么多。我认为这只是让你的类只创建一个对象然后与其他类共享该对象的一种方法。这两个过程(淡出音乐和过渡到其他场景)甚至可以同时运行吗?

以上是关于为啥我的音频会在 Sprite Kit 场景转换之前播放?的主要内容,如果未能解决你的问题,请参考以下文章

我的 Sprite Kit 游戏第一次播放音频变慢?

iOS 如何在 Sprite Kit 游戏中创建音频淡入/淡出效果?

如何在 Sprite Kit 中初始化所有场景?

在 Sprite Kit 场景中隐藏 iAd

Sprite Kit:如何在运行场景之上添加场景

Sprite Kit 场景编辑器 GameScene.sks 场景宽度和高度