2012-03-14 13 views
5

Bastante simple ... Tengo una canción de fondo en mi juego, y me gustaría hacer un fundido cruzado de una pista, en lugar de una parada difícil.¿Cómo cruzo la música en 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]; 
     } 

Respuesta

4

No puede hacer eso usando SimpleAudioEngine. Aquí es cómo lo hice:

  1. Crear una clase que se extiende CDAudioManager

  2. En el método que llame a empezar a jugar una nueva música de fondo, primero verifique si el Ivar backgroundMusic (heredado de CDAudioManager) no es nada y está jugando. Si es así, descolore usando CDLongAudioSourceFader.

  3. Cargue la nueva música de fondo en backgroundMusic (es una instancia de CDLongAudioSource - búsquelo). Fundido en el uso de CDLongAudioSourceFader.

He aquí un fragmento del método en el paso 2 (lo siento, no se puede mostrar el resto, ya que es parte de mi propia biblioteca propietaria)

- (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

Muy bien, gracias. –

5

utilizo este método simple para reemplazar el actual música de fondo:

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

Hope that helps!

0

Gracias por la respuesta de @ adam.artajew! Lo modifiqué para usarlo con Cocos2D v3 e hice una categoría Crossfade en el motor de audio para usarlo desde cualquier lugar del juego. Ahora que realiza las acciones siguientes:

  • Fundido en
  • Cambio pista
  • Fundido en

En OALSimpleAudio+Crossfade.m incluyen estas importaciones:

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

y poner en práctica el método:

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

Uso: IncluirOALSimpleAudio+Crossfade.h y llamar

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