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

时间:2015-06-01 07:40:51

标签: ios objective-c sprite-kit

每当我呈现我的场景时,我都想开始播放音乐文件,并在上一次呈现场景时停止播放音乐。我试图这样做。

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

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

此外,我想知道是否有一种方法可以在所有场景中永久播放音乐文件,而无需从头开始。

2 个答案:

答案 0 :(得分:3)

要在所有场景中播放背景音乐,我会推荐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];
}

答案 1 :(得分:1)

对于音乐,您应该使用AVAudioPlayer,因为使用SKAction播放音乐会阻止您可能想要在场景中运行的任何其他操作,并且处理起来会更麻烦,尤其是如果您想要播放音乐伴随着更多的声音。

使用SKAction播放简短的声音文件(如播放器跳/火等......)

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