1

背景: 曲の繰り返しごとにピッチを変更したいので、私の背景音楽は効果音として再生されています。

問題: バックグラウンドミュージックの再生中に、他にも多くの短い効果音が発生します。一定数の効果音が再生された後、私のバックグラウンドミュージック(効果音も)が途切れます。キューは循環しているようで、たとえば50の効果音が再生された後、51番目の効果音が再生されると、完了したかどうかに関係なく1番目の効果音が解放されます。

方向性の要求: この問題でおそらく進むことがわかる2つの方向性があります。1.エフェクトとしてバックグラウンドミュージックを再生せず、エフェクトではなくバックグラウンドミュージックとしてピッチを変更する方法を理解します。2。エフェクトが完了するまで、エフェクトが保持されるようにする方法があります。

ありがとう

4

1 に答える 1

4

SimpleAudioEngineではチャンネルを制御できないため、内部で割り当てられたチャンネルの1つでサウンドエフェクトを再生するだけです。最終的には、すべてのチャンネルでオーディオが再生されます。その場合、新しいオーディオファイルが再生され、すべてのチャネルがすでに再生されていると、SimpleAudioEngineは既存のオーディオファイルの1つをキャンセルします。時々、これはあなたのバックグラウンドミュージックになります。ダン。

これを修正するために通常行うことは、バックグラウンドミュージック専用に1つのオーディオチャネルを割り当てる(割り当てる)ことです。他のオーディオがそのチャネルでオーディオを再生しようとすることはありません。「通常の」CocosDenshionAPIを使用する必要があります。CDAudioManagerまたはCDSoundEngineのいずれかを使用する必要があるようですが、 CocosDenshionでチャネルを使用した経験はありません。

個人的には、CocosDenshionを使用したことはありません。より詳細な制御が必要なときはいつでも、ObjectAL APIの方が理解しやすく、優れたドキュメントがあります。特定のチャンネルでサウンドを再生する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クラスで再生している他のすべてのオーディオファイル。

于 2011-10-15T21:57:27.520 に答える