2012-03-14 14 views
5

Abbastanza semplice ... Ho una canzone di sottofondo che suona sul mio gioco, e mi piacerebbe crossfade una traccia, invece di una sosta dura.In che modo crossfade la musica in cocos2d?

//Prep Background Music 
     if (![[SimpleAudioEngine sharedEngine]isBackgroundMusicPlaying]) { 
      [[SimpleAudioEngine sharedEngine] preloadBackgroundMusic:@"song.mp3"]; 
     } 
     [[SimpleAudioEngine sharedEngine] setBackgroundMusicVolume:1.0]; 

     //Play Background Music 
     if (![[SimpleAudioEngine sharedEngine]isBackgroundMusicPlaying]) { 
      [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"song.mp3" loop:YES]; 
     } 

risposta

4

Non è possibile farlo utilizzando SimpleAudioEngine. Ecco come ho fatto:

  1. Creare una classe che estende CDAudioManager

  2. Nel metodo che si chiama per avviare la riproduzione di una nuova musica di sottofondo, prima verifica se l'Ivar backgroundMusic (ereditato da CDAudioManager) non è nulla e sta giocando. Se lo è, dissolvilo usando CDLongAudioSourceFader.

  3. Caricare la nuova musica di sottofondo in backgroundMusic (è un'istanza di CDLongAudioSource - cercare). Dissolvenza usando CDLongAudioSourceFader.

Ecco un frammento del metodo in fase 2 (purtroppo non è possibile mostrare il resto in quanto è parte della mia libreria proprietaria)

- (void)audioBackgroundPlay:(NSString *)bgmfile crossfade:(float)fade { 
    CDLongAudioSource *audioSource = [self audioBackgroundLoad:bgmfile]; 
    if (audioSource != backgroundMusic) { 
     if (backgroundMusic) { 
      [self audioBackgroundControl:AUDIOCTRL_STOP fade:fade]; 
      backgroundMusic.audioSourcePlayer.meteringEnabled = NO; 
      [backgroundMusic release]; 
     } 
     backgroundMusic = [audioSource retain]; 
     if (meteringEnabled_) { 
      backgroundMusic.audioSourcePlayer.meteringEnabled = YES; 
     } 
    } 
    if (![backgroundMusic isPlaying]) { 
     [self audioBackgroundControl:AUDIOCTRL_PLAY fade:fade]; 
    } 
} 
+0

Va bene, grazie. –

5

Io uso questo metodo semplice per sostituire corrente musica di sottofondo:

-(void)replaceBackgroundMusic:(NSString *)filePath volume:(float)volume 
{ 
    // no music's playing right now 
    if (![[SimpleAudioEngine sharedEngine] isBackgroundMusicPlaying]) 
     return [self playBackgroundMusic:filePath volume:volume]; 

    // already playing requested track 
    if ([filePath isEqualToString:[[[CDAudioManager sharedManager] backgroundMusic] audioSourceFilePath]]) 
     return; 

    // replace current track with fade out effect 
    float currentVolume = [SimpleAudioEngine sharedEngine].backgroundMusicVolume; 
    id fadeOut = [CCActionTween actionWithDuration:1 key:@"backgroundMusicVolume" from:currentVolume to:0.0f]; 
    id playNew = 
    [CCCallBlock actionWithBlock:^ 
    { 
     [[SimpleAudioEngine sharedEngine] setBackgroundMusicVolume:volume]; 
     [[SimpleAudioEngine sharedEngine] playBackgroundMusic:filePath]; 
    }]; 

    [[[CCDirector sharedDirector] actionManager] addAction:[CCSequence actions:fadeOut, playNew, nil] target:[SimpleAudioEngine sharedEngine] paused:NO]; 
} 

Sperare che aiuti!

0

Grazie per la risposta di @adam.artajew! L'ho modificato da utilizzare con Cocos2D v3 e ho creato una categoria Crossfade sul motore audio per usarlo da qualsiasi punto del gioco. Ora essa svolge seguenti azioni:

  • Fade Out
  • Cambiare il brano
  • Fade in

In OALSimpleAudio+Crossfade.m includono queste importazioni:

#import "CCDirector_Private.h" 
#import "CCActionManager.h" 

e metodo implementano:

- (void)playBg:(NSString *)name crossfade:(BOOL)crossfade { 

    // Skip if already playing requested track 
    if (self.bgPlaying && 
     [self.backgroundTrack.currentlyLoadedUrl.lastPathComponent isEqualToString:name]) { 
     return; 
    } 

    // Play right now if no crossfade needed 
    if (!crossfade) { 
     [self playBg:name loop:true]; 
    } 

    // Fade out just if music's playing right now 
    NSMutableArray *actions = [NSMutableArray array]; 
    if (self.bgPlaying) { 
     id fadeOut = [CCActionTween actionWithDuration:0.5 key:@"bgVolume" from:self.bgVolume to:0.0f]; 
     [actions addObject:fadeOut]; 
    } 
    // Replace current track with fade in effect 
    id playNew = [CCActionCallBlock actionWithBlock:^{ 
     [self playBg:name loop:true]; 
    }]; 
    id fadeIn = [CCActionTween actionWithDuration:0.5 key:@"bgVolume" from:0.0f to:1.0f]; 
    // Combime final action 
    [actions addObjectsFromArray:@[playNew, fadeIn]]; 
    id sequence = [CCActionSequence actionWithArray:actions.copy]; 

    // Run action 
    [[[CCDirector sharedDirector] actionManager] addAction:sequence target:self paused:NO]; 
} 

Usage: Includere OALSimpleAudio+Crossfade.h e chiamare

[[OALSimpleAudio sharedInstance] playBg:@"MainBgMusic.mp3" crossfade:YES];