Sprite Kit 停止播放音乐文件并从头开始播放

Sprite Kit stop playing music file and start from the beginning

每当我展示我的场景时,我都想开始播放音乐文件并停止播放上次展示我的场景时的音乐。我正在尝试这样做。

[self removeActionForKey:@"Music"];
[self runAction:[SKAction repeatActionForever:[SKAction playSoundFileNamed:@"Music.wav" waitForCompletion:YES]] withKey:@"Music"];

我应该使用 AVAudioPlayer 还是 [SKAction playSoundFileNamed:]

我也想知道有没有什么方法可以不从头开始在所有场景下一直播放音乐文件

要在所有场景播放背景音乐我会推荐AVAudioPlayer。您可以在 AppDelegate 的某处编写代码以从所有场景访问。这是使用 AVAudioPlayer

实现此目的的示例代码
//    AVAudioPlayer *bgMusicLoop;

- (void)playBackroundMusic:(NSString *)fileName withExtenstion:(NSString *)fileExtension
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:fileExtension];
    NSError *error;
    if(bgMusicLoop)
        [bgMusicLoop stop];
    bgMusicLoop = nil;
    bgMusicLoop = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath] error:&error];
    if (error) {
        NSLog(@"Error in audioPlayer: %@", [error localizedDescription]);
    } else {
        bgMusicLoop.numberOfLoops = -1;
        [bgMusicLoop prepareToPlay];
        [bgMusicLoop play];
    }
}

- (void)stopBackgroundMusic
{
    if(bgMusicLoop)
        [bgMusicLoop stop];
    bgMusicLoop = nil;
}

- (void)pauseBackgroundMusic
{
    if(bgMusicLoop && bgMusicLoop.isPlaying)
        [bgMusicLoop pause];
}

- (void)resumeBackgroundMusic
{
    if(bgMusicLoop && !bgMusicLoop.isPlaying)
        [bgMusicLoop play];
}

对于音乐,您应该使用 AVAudioPlayer,因为使用 SKAction 播放音乐会阻止您可能希望在现场 运行 进行的任何其他操作,并且处理起来有点麻烦特别是如果你想随着音乐播放更多的声音。

使用SKAction播放短声音文件(如播放器jump/fire等...)

使用 AVAudioPlayer 您可以轻松地将文件设置为重复播放直到停止