2012-05-21 94 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