“无效的对象句柄使用”在FMOD 3D音效收听
问题描述:
我试图建立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声音播放不正确的原因。
答
无效的处理错误(FMOD_ERR_INVALID_HANDLE)指的是你在调用函数的对象,在这种情况下,它意味着m_system句柄无效。
首先我注意到你已经被遗漏的代码来创建FMOD ::系统对象,就可以确认你正在做以下几点:
result = FMOD::System_Create(&m_system);
其次,只要你有代码的地方,你可以验证m_system的值在创建和使用时保持不变(可能是破坏了句柄)。
最后(作为一个长镜头),如果你的标题和11b是不同步的,你可能会得到一个不同的错误信息,确保您使用的都是来自同一个版本FMOD的头文件和库。
额外注,尝试FMOD的日志版本链接,你应该得到的TTY一些有用的调试输出,可以帮助您的情况。
你完全正确,m_system为空。我在另一个类中创建了FMOD系统,并且应该在这个类中传递指向m_system的指针。我不知道你可以在空指针上调用函数,如果函数不访问成员变量,程序不会中断,所以我学到了一些新东西。 – 2010-10-07 22:55:02
非常好,是的,只要类不触及任何成员变量,你可以调用一个NULL指针的函数。如果仔细观察FMOD的“指针”,尽管你会注意到它们中的大多数实际上都是处理的,所以像'1'这样的值是完全有效的。 – 2010-10-11 03:32:29