2

我在我的游戏中使用 cocos denshion 作为音乐。我目前正在使用代码播放背景音乐:
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"backSong.mp3"];
但是,当游戏结束时,我需要背景音乐逐渐淡出。我怎样才能淡出背景音乐,有没有办法做到这一点?提前致谢!此外,ObjectAL 是否比 CocosDenshion 更好?如果是这样,有什么区别/优势?

4

2 回答 2

9

尝试这个:

float currentVolume = [SimpleAudioEngine sharedEngine].backgroundMusicVolume;
id fadeOut = [CCActionTween actionWithDuration:1 key:@"backgroundMusicVolume" from:currentVolume to:0.0f];
[[[CCDirector sharedDirector] actionManager] addAction:fadeOut target:[SimpleAudioEngine sharedEngine] paused:NO];

希望有帮助!

于 2014-01-21T21:08:10.053 回答
2

我发现这样做的唯一方法是安排一个执行方法并相应地更改音量设置,如下所示:

-(void) fadeOutBackgroundMusic{
    if (!currentBackgroundMusic_) {
        CCLOG(@"GESoundServicesProviderImpl<fadeOutBackgroundMusic> : No background music at this time, ignoring.");
        return;
    }

    fadeOutActionTickerCount_=0;
    [self schedule:@selector(tickMusicFadeOut:)];

}

-(BOOL) isPlayingBackgroundMusic{
    return isPlayingBackgroundMusic_;
}

#pragma mark sequencing stuff

-(void) tickMusicFadeOut:(ccTime) dt{

    static float fadeTime;
    static float volume;
    static float maxVolume;

    fadeOutActionTickerCount_++;
    if (1==fadeOutActionTickerCount_) {
        isPerformingFadeOutAction_ =YES;
        fadeTime=0.0f;
        volume=0.0f;
        maxVolume=audioSettings_.masterVolumeGain*audioSettings_.musicCeilingGain;

    } else {

        fadeTime+=dt;
        volume=MAX(0.0f, maxVolume*(1.0 - fadeTime/K_MUSIC_FADE_TIME));
        [self setMusicVolume:volume];

        if (fadeTime>K_MUSIC_FADE_TIME) {
            volume=0.0f;                        // in case we have a .000000231 type seting at that moment.
        }


        if (volume==0.0f) {
            CCLOG(@"GESoundServicesProviderImpl<tickMusicFadeOut> : background music faded out in %f seconds.",fadeTime);
            [self setMusicVolume:0.0f];
            [sharedAudioEngine_ stopBackgroundMusic];
            self.currentBackgroundMusic=nil;
            isPlayingBackgroundMusic_=NO;
            isPerformingFadeOutAction_=NO;
            [self unschedule:@selector(tickMusicFadeOut:)];
        }
    }

}

这是来自我的声音服务提供者实现类的简化(编辑)示例(未测试,如此处所示)。一般的想法是为自己安排一个在一段时间内逐渐淡出音乐的方法(这里是一个应用程序范围的常量,K_MUSIC_FADE_TIME)。

于 2012-05-22T20:06:12.043 回答