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 ご覧いただきありがとうございます。

4

3 に答える 3

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

これは、長い効果音が1つしかない場合にのみ機能すると確信しています。複数の長い効果音がある場合は、別の方法でアプローチする必要があると思います。CDLongAudioSourceのインスタンスをさらに作成しない限り、誰かがそのためのリンク/チュートリアルを持っていますか?ありがとう!

于 2012-04-07T23:42:47.973 に答える
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 を超えると、最初のエフェクトのチャンネルは新しいエフェクトに置き換えられません。

于 2012-05-02T12:56:54.680 に答える
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];
}
于 2012-04-10T18:40:27.093 に答える