我想知道我做错了什么。我已经设置了我的SoundManager类有5个不同的通道,在我的游戏中可以同时播放一些声音,比如枪被射击和敌人“伤害”声音......这就是我设置FMOD的方法函数我打电话来播放声音的方式是它们总是重绕到开头:
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);
...
然而结果非常随机,两个声音很少同时播放,而大部分时间只播放两个声音中的一个......
我也有一个循环模式:
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)
....
但即使在不同的频道上播放,其他非循环声音也会随机中断?
我非常感谢您提供的任何帮助
提前感谢您提供的任何帮助。
答案 0 :(得分:1)
我不知道您的问题,但我可以建议使用数组存储chn1
.. chrN
值,以便您在代码中避免所有这些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);
答案 1 :(得分:0)
我解决了这个问题。当我使用1024个通道而不是7个
初始化FMOD时,此设置实际上工作正常fmodsys->init(1024, FMOD_INIT_NORMAL, 0);
频道显然重量很轻,使用后无需清洁,因此他们建议在论坛上始终在PC上初始化1024.