在ogre 基础教程7 点击前往 有以下一段
bool BasicTutorial7::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
if(CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id))) return true;
mCameraMan->injectMouseDown(arg, id);
return true;
}
他的本意如果cegui控件处理了消息 则返回,否则控制mCameraMan这句 但是实际下断点执行发现 无论你是否点击创建的按钮或者其他ogre 场景区域都不会在这句下断下,跟踪
(CEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id)))这个函数发现 即使不点击button也会返回true,由于不点击button他会认为你点击了 CEGUI::Window *sheet = wmgr.createWindow("DefaultWindow", "CEGUIDemo/Sheet");这个你创建的根窗体,而导致返回true。
这个如果应用到游戏中 则可能导致你建立UI 结果鼠标无法控制到游戏场景。怎么办不得不翻阅资料,google bing 结果发现网上很多类似例子 通过去掉if 来解决解决方案如下:
bool BasicTutorial7::mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
iCEGUI::System::getSingleton().injectMouseButtonDown(convertButton(id))
mCameraMan->injectMouseDown(arg, id);
return true;
}
这将要产生一个新的问题 在你不点击ui时的确可以解决问题,但你如果点击到UI则你同时会操作到场景,这并不是我们想要的。
结果花了一整天的时间 不停换各种关键字搜索终于找到一个合理的解决方法:
将 CEGUI::Window *sheet = wmgr.createWindow("DefaultWindow", "CEGUIDemo/Sheet");创建的根窗体设置成鼠标可以通过
sheet->setMousePassThroughEnabled(true);即
CEGUI::Window *sheet = wmgr.createWindow("DefaultWindow", "CEGUIDemo/Sheet");
sheet->setMousePassThroughEnabled(true);
问题圆满解决,这个问题白白浪费我一天的时间。同时希望能给你们带来帮助。