0

私は何か間違ったことをしているのだろうかと思っています。私は、SoundManager クラスを 5 つの異なるチャンネルを持つようにセットアップしました。私のゲームでは、銃が発射され、敵が「痛い」音など、いくつかのサウンドが同時に再生される場合があります。関数を呼び出して、常に先頭に巻き戻されるようにサウンドを再生します。

void SoundMgr::init(){

    System_Create(&fmodsys);
    fmodsys->init(5, FMOD_INIT_NORMAL, 0)
} 

void SoundMgr::play(string name, int chan){
    if(chan == 1){
        fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn1);
        chn1->setMode(FMOD_LOOP_OFF);
        chn1->setPosition(0, FMOD_TIMEUNIT_PCM);
        chn1->setPaused(false);
    } else if(chan == 2){
        fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn2);
        chn2->setMode(FMOD_LOOP_OFF);
        chn2->setPosition(0, FMOD_TIMEUNIT_PCM);
        chn2->setPaused(false);
    } else if(chan == 3){
        fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn3);
        chn3->setMode(FMOD_LOOP_OFF);
        chn3->setPosition(0, FMOD_TIMEUNIT_PCM);
        chn3->setPaused(false);
    } else if(chan == 4){
        fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn4);
        chn4->setMode(FMOD_LOOP_OFF);
        chn4->setPosition(0, FMOD_TIMEUNIT_PCM);
        chn4->setPaused(false);
    } else if(chan == 5){
        fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn5);
        chn5->setMode(FMOD_LOOP_OFF);
        chn5->setPosition(0, FMOD_TIMEUNIT_PCM);
        chn5->setPaused(false);
    }

}

そして、私が持っているゲームでは (これは単なる例ですが、ほとんどのサウンドで発生します):

....
sMgr->play("gunshot", 1);
....

sMgr->play("rat_hurt", 3);

...

ただし、結果は非常にランダムで、2 つのサウンドが同時に再生されることはめったにありませんが、ほとんどの場合、2 つのサウンドのうちの 1 つだけが再生されます...

また、ループモードがあります:

void SoundMgr::playRepeat(string name, int chan){
   if(chan == 1){
      fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &chn1);
      chn1->setMode(FMOD_LOOP_NORMAL);
      chn1->setPosition(0, FMOD_TIMEUNIT_PCM);
      chn1->setPaused(false);
   } else if(chan == 2)

....

しかし、それも別のチャンネルで再生されたとしても、他の非ループ音によってランダムに中断されますか?

あなたが提供できるかもしれない助けを本当に感謝します

ご協力いただける場合は、あらかじめご了承ください。

4

2 に答える 2

1

あなたの問題はわかりませんが、配列を使用してchn1..値を格納することをお勧めします。これにより、コード内で次のchrNすべての s を回避できます。if

  assert(chan >= 0 && chan < sizeof(channel_array));
  channel& the_chn = channel_array[chan];
  fmodsys->playSound(FMOD_CHANNEL_FREE, soundMap.find(name)->second, true, &the_chn);
  the_chn->setMode(FMOD_LOOP_NORMAL);
  the_chn->setPosition(0, FMOD_TIMEUNIT_PCM);
  the_chn->setPaused(false);
于 2011-12-05T14:15:39.423 に答える
0

問題を解決しました。FMOD を 7 チャンネルではなく 1024 チャンネルで初期化すると、この設定は実際には正常に機能します。

fmodsys->init(1024, FMOD_INIT_NORMAL, 0);

チャンネルは明らかに非常に軽量で、使用後にクリーニングする必要がないため、フォーラムでは常に PC で 1024 を初期化することを推奨しています。

于 2011-12-06T01:07:58.560 に答える