SimpleAudioEngine не позволяет вам управлять каналами, поэтому он будет просто воспроизводить ваши звуковые эффекты на одном из каналов, которые он выделил внутри. В конце концов все каналы воспроизводят аудио. В этом случае, когда новый аудиофайл должен быть воспроизведен, и все каналы уже воспроизводятся, SimpleAudioEngine отменит один из существующих аудиофайлов. Иногда это будет ваша фоновая музыка. Dang.
Что вы обычно делаете, чтобы это исправить, это назначаете (выделяете) один аудиоканал специально для фоновой музыки. Никакой другой звук никогда не будет пытаться воспроизвести звук на этом канале. Вам придется использовать «обычный» CocosDenshion API . Похоже, вам либо нужно использовать CDAudioManager или CDSoundEngine , но у меня нет опыта использования каналов с CocosDenshion.
Лично я никогда не использовал CocosDenshion, всякий раз, когда мне требовалось больше контроля, я обнаруживал, что API ObjectAL проще для понимания и у него есть отличная документация. Я сделал следующую вспомогательную функцию для ObjectAL, которая воспроизводит звук на определенном канале. Я просто создал ALChannelSource для своей фоновой музыки и воспроизводил только фоновую музыку через этот канал. Возвращенный ALSoundSource даже позволяет вам изменять высоту, панорамирование и т. Д. Во время воспроизведения звука.
+(id<ALSoundSource>) playEffect:(NSString*)effect channel:(ALChannelSource*)channel loop:(bool)loop
{
id<ALSoundSource> soundSource = nil;
if (channel)
{
ALBuffer* buffer = [[OALAudioSupport sharedInstance] bufferFromFile:effect];
soundSource = [channel play:buffer loop:loop];
}
return soundSource;
}
Все остальные аудиофайлы, которые я воспроизводю в классе OALSimpleAudio .