我試圖建立3D在使用食人魔遊戲與FMOD聲音。聲音監聽器連接到以樣條線運行的相機。我有附加到播放器的腳步聲音,音量應由播放器距離相機多遠來決定。「無效的對象句柄使用」在FMOD 3D音效收聽
踩在腳下的聲音充當雖然聲音聽者不從它的起始位置移動。在關卡開始時,腳步聲很大,當你離開時,他們會變得更安靜,直到你再也聽不到它們了。如果你跑回去,他們會變得更響。但是,聲音聽者的場景節點的位置正在更新並與相機保持同步。
在代碼有正在生成一個錯誤FMOD下面的行上的每一幀:
result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);
結果總是返回FMOD_ERR_INVALID_HANDLE,用下面的錯誤串 - 「無效對象句柄被用於」。我無法弄清楚爲什麼會產生這個錯誤。所有的FMOD_VECTORs作爲參數被傳入並被初始化,我似乎正在設置系統。該代碼是遍佈不同類的地方,但這裏有重要的位:
// Initialise FMOD system
result = m_system->init(4093, FMOD_INIT_3D_RIGHTHANDED, 0);
result = m_system->set3DSettings(1.0f, 1.0f, 1.0f);
// Create sound
FMOD_MODE mode = FMOD_SOFTWARE;
if(a_positional)
{
mode |= FMOD_3D;
}
FMOD_CREATESOUNDEXINFO info;
memset(&info, 0, sizeof(FMOD_CREATESOUNDEXINFO));
info.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
r = sys->_getFMODSystem()->createSound(a_file.c_str(), mode, &info, &retVal);
// Update sound listener
FMOD_VECTOR pos, vel, forward, up;
pos.x = m_sceneNode->getParentSceneNode()->_getDerivedPosition().x;
pos.y = m_sceneNode->getParentSceneNode()->_getDerivedPosition().y;
pos.z = m_sceneNode->getParentSceneNode()->_getDerivedPosition().z;
vel.x = 0;
vel.y = 0;
vel.z = 0;
forward.x = 0;
forward.y = 0;
forward.z = 1;
up.x = 0;
up.y = 1;
up.z = 0;
result = m_system->set3DListenerAttributes(0, &pos, &vel, &forward, &up);
// FMOD error: (36) An invalid object handle was used.
任何想法,爲什麼「結果」將返回這個錯誤?我假設這是3D聲音播放不正確的原因。
你完全正確,m_system爲空。我在另一個類中創建了FMOD系統,並且應該在這個類中傳遞指向m_system的指針。我不知道你可以在空指針上調用函數,如果函數不訪問成員變量,程序不會中斷,所以我學到了一些新東西。 – 2010-10-07 22:55:02
非常好,是的,只要類不觸及任何成員變量,你可以調用一個NULL指針的函數。如果仔細觀察FMOD的「指針」,儘管你會注意到它們中的大多數實際上都是處理的,所以像'1'這樣的值是完全有效的。 – 2010-10-11 03:32:29