Как мне перекодировать музыку в cocos2d? - PullRequest
5 голосов
/ 15 марта 2012

Достаточно просто ... У меня есть фоновая песня, играющая в мою игру, и я бы хотел добавить плавный переход трека, а не жесткую остановку.

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

Ответы [ 3 ]

5 голосов
/ 22 января 2014

Я использую этот простой метод для замены текущей фоновой музыки:

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

Надеюсь, это поможет!

4 голосов
/ 15 марта 2012

Вы не можете сделать это, используя 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 голосов
/ 25 августа 2015

Спасибо за ответ @ adam.artajew! Я изменил его для использования с Cocos2D v3 и создал категорию Crossfade на аудио движке, чтобы использовать его из любого места в игре. Теперь он выполняет следующие действия:

  • Исчезает
  • Смена дорожки
  • Fade in

В OALSimpleAudio+Crossfade.m включают эти импортные данные:

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

И реализовать метод:

- (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...