2012-04-07 16 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]; 

私は」他のサウンドが再生されているので、充電音が "スロット"を失っていると思いますか?上記のように、私は最大7つまたは8つのサウンド最大充電音効果がオフに同時に再生することがあります。

私のサウンドが「スロット」を失っている場合、特定のサウンドエフェクトをロックして「スロット」を失わない方法がありますか?

私は何が間違っているのか、これを改善するために何ができるのかについてのアイデアはありますか?どんな助けでも大歓迎です! :D探してくれてありがとう。

答えて

1

複数のサウンドを再生するには、SimpleAudioEngineではなくCDSoundEngineでCDAudioManagerを使用します。

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

[OK]を、私はそれからチュートリアルを見た後に考え出しました:

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

私はSimpleAudioEngineが短いサウンド効果のためのものであることを認識していませんでした。インターフェイスで

:私のinitまたはsetupSound方法で

CDLongAudioSource *rightChannel; 

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

そして、この時点で立ち往生している人のために

は、ここで私がやったことです私がそれをしたいとき:

[rightChannel play]; 

長いサウンド効果が1つしかない場合にのみ有効です。長いサウンドエフェクトが複数ある場合は、別の方法でアプローチする必要があります。私はCDLongAudioSourceのインスタンスをもっと作成していないのですか?誰にもリンク/チュートリアルがありますか?ありがとう!

1

私の簡単な英語...
シンプルなエンジンのため申し訳ありませんが、現時点

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のオーディオチャンネルを持っています

この場合、最初のエフェクトのチャンネルは新しいエフェクトに置き換えられました。実行回数が32以上の場合は

関連する問題