2012-04-07 143 views
2

我有一個8秒長的充電聲音效果,只有在遊戲中的每個關卡結束時纔會觸發。正在播放多個聲音時音效中途停止?

問題是,當有其他聲音同時播放(激光,爆炸等)時,聲音效果在中途停止。我在其他地方閱讀時可以同時播放多達32個同時播放的聲音,但該遊戲最多可同時播放7個或8個音效。但充電效果依然不佳。

如果我沒有在遊戲中進行任何拍攝,並讓充電效果起作用,它會一直播放。

我預載我的聲音在啓動時就像這樣:

-(void)setupSound 
{ 
    [[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"Kickshock.mp3" loop:YES]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"explosion_large.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"explosion_small.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"laser_ship.caf"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"powerup.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"railgun.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"metal.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"count.mp3"]; 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"charge_up.mp3"]; 
} 

-(id)init 
{ 
    if((self = [super init])) 
    { 
     [self setupSound]; 
     // Rest of other code.. 
    } 
    return self; 
} 

,我發揮他們在需要時(拍攝激光,水平的結束,東西爆炸等):

[[SimpleAudioEngine sharedEngine] playEffect:@"charge_up.mp3" pitch:1.0 pan:0.0 gain:0.4]; 

我guess猜測充電聲音正在失去其「槽」,因爲其他聲音正在播放?如上所述,當充電音效切斷時,我最多隻能同時播放7或8個聲音。

如果我的聲音正在失去其「插槽」,是否有一種方法可以鎖定特定的聲音效果,使其不會丟失其「插槽」?

任何想法,我做錯了什麼,或者我可以做些什麼來彌補這一點?任何幫助是極大的讚賞! :D感謝您的期待。

回答

1

要播放多個聲音,我會使用CDAudioManager與CDSoundEngine而不是SimpleAudioEngine。

CDSoundEngine允許多個通道(最多32個),可以同時播放聲音。

例子:

// create engine 
CDSoundEngine * engine = [CDAudioManager sharedManager].soundEngine; 

// assign groups 
NSArray * groups = [NSArray arrayWithObjects: 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], 
    [NSNumber numberWithInt:1], nil]; 

[engine defineSourceGroups:groups]; 
[CDAudioManager initAsynchronously:kAMM_FxPlusMusicIfNoOtherAudio]; 

// load requests 
NSMutableArray * requests = [[[NSMutableArray alloc] init] autorelease]; 

NSString * plist_sounds = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:[NSString stringWithFormat:@"Sounds.plist"]]; 
if (![[NSFileManager defaultManager] fileExistsAtPath:plist_sounds]) { 
    plist_sounds = [[NSBundle mainBundle] pathForResource:@"Sounds" ofType:@"plist"]; 
} 
NSDictionary * dictionary_sounds = [[NSDictionary dictionaryWithContentsOfFile:plist_sounds] objectForKey:@"Sounds"]; 
if (dictionary_sounds != nil) { 
    for (id key in dictionary_sounds) { 
     [requests addObject:[[[CDBufferLoadRequest alloc] init:[key intValue] filePath:[dictionary_sounds objectForKey:key]] autorelease]]; 
    } 
} 

[engine loadBuffersAsynchronously:requests]; 

然後播放聲音:

- (ALuint)play:(NSInteger)sound group:(NSInteger)group loop:(BOOL)forever volume:(float)volume { 
    [[CDAudioManager sharedManager].soundEngine playSound:sound sourceGroupId:group pitch:1.0f pan:0.0f gain:volume loop:forever]; 
} 
1

好我是從看教程後想通了:

http://bobueland.com/cocos2d/?p=200

我沒有意識到SimpleAudioEngine是爲短的聲音效果。

對於那些你被卡住在這一點上誰,這裏就是我所做的:

在接口:

CDLongAudioSource *rightChannel; 

在我的init或setupSound方法:

rightChannel = [[CDAudioManager sharedManager] audioSourceForChannel:kASC_Right]; 
[rightChannel load:@"charge_up.mp3"]; 

而且當我想玩的時候:

[rightChannel play]; 

我相信這隻會在你只有一個長音效時才起作用。如果你有多個長音效果,我相信你必須以不同的方式處理它。除非我只是創建更多的CDLongAudioSource實例?有沒有人有任何鏈接/教程?謝謝!

1

對不起,我簡單的英文...
簡單的發動機必須在瞬間最多32個音頻通道

if(SoundId == 0) 
{ 
    // when you say playEffect engine capture one channel for effect 
    // do playEffect once and save result SoundID for Stop or Resume effect 
    SoundId = SimpleAudioEngine::sharedEngine()->playEffect("audio.mp3"); 
} 
// effect loaded, channel captured, say resume for play effect again, nothing more 
else 
{ 
    SimpleAudioEngine::sharedEngine()->resumeEffect(SoundId); 
} 

// if you say effect nothing will happen with channel try 
SimpleAudioEngine::sharedEngine()->stopEffect(SoundID); 

在這種情況下,第一個效果的頻道不會是換成新的效果, 如果運行次數多於32