2012-05-21 62 views
2

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

回答

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)。

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]; 

希望帮助!

+1

巧妙实现只有3行。我喜欢聪明的代码。根据问题应该首选这个答案。 – gdbj