2012-03-14 5 views
5

シンプルだけど...私は自分のゲームでバックグラウンドの歌を演奏しているし、ハードストップの代わりにトラックをクロスフェードしたい。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]; 
     } 

答えて

4

SimpleAudioEngineを使用することはできません。ここで私はそれをやった方法です:

  1. 新しいバックグラウンドミュージックの再生を開始するために呼び出すメソッドでCDAudioManager

  2. を拡張するクラスを作成し、IVAR backgroundMusicは(CDAudioManagerから継承された)場合は、最初のチェック無しではありません。そうであれば、CDLongAudioSourceFaderを使用して消してください。

  3. 新しい背景音楽をbackgroundMusicにロードします(これはCDLongAudioSourceのインスタンスです)。 CDLongAudioSourceFaderを使用して消してください。ここで

は、ステップ2の方法の抜粋です私は現在を置き換えるために、この単純な方法を使用し

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

オーケーを呼び出し、ありがとうございました。 –

5

(それは私の独自のライブラリの一部であるとして、あなたは残りの部分を表示することはできません申し訳ありません)バックグラウンドミュージック:助け

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

願っています!

0

@ adam.artajewさんのお返事ありがとうございます! Cocos2D v3と一緒に使用するように変更し、オーディオエンジンのカテゴリCrossfadeを作成して、ゲームのどこからでも使用できます。今では、次のアクションを実行します。

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

と方法を実装:

OALSimpleAudio+Crossfade.m

  • フェードアウト
  • 変更トラック
  • フェードは、これらの輸入品が含ま
    - (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]; 
    } 
    

    使用方法:OALSimpleAudio+Crossfade.hを含めると

    [[OALSimpleAudio sharedInstance] playBg:@"MainBgMusic.mp3" crossfade:YES]; 
    
関連する問題