Ogre,里面是用cegui鼠标点不到场景

本文解决了一个在使用Ogre与CEGUI时遇到的问题:鼠标点击UI时无法正常控制游戏场景。通过调整CEGUI窗口设置实现鼠标穿透,确保用户交互既不影响UI也不干扰场景控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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);

问题圆满解决,这个问题白白浪费我一天的时间。同时希望能给你们带来帮助。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值