OGRE+CEGUI+OIS 鼠标非独占使用
2010-05-10 15:04
351 查看
代码:
//用于在OIS和CEGUI之间转换鼠标
CEGUI::MouseButton convertOISMouseButtonToCegui(int buttonID)
{
switch (buttonID)
{
case 0: return CEGUI::LeftButton;
case 1: return CEGUI::RightButton;
case 2: return CEGUI::MiddleButton;
case 3: return CEGUI::X1Button;
default: return CEGUI::LeftButton;
}
}
// Event handler to add ability to alter curvature
class GameMainFrameListener : public Ogre::FrameListener, public WindowEventListener,public OIS::KeyListener,public OIS::MouseListener
{
protected:
RenderWindow* mWindow;
Camera* mCamera;
SceneManager* mSceneMgr;
//OIS Input devices
OIS::InputManager* mInputManager;
OIS::Mouse* mMouse;
OIS::Keyboard* mKeyboard;
OIS::JoyStick* mJoy;
bool mShutdownRequested;
bool mSysMouseShowFlag;
public:
GameMainFrameListener(RenderWindow* win, Camera* cam, SceneManager* mgr)
: mWindow(win),
mCamera(cam),
mSceneMgr(mgr),
mInputManager(0), mMouse(0), mKeyboard(0), mJoy(0)
{
mShutdownRequested = false;
mSysMouseShowFlag = false;
ShowCursor(0);
LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
OIS::ParamList pl;
size_t windowHnd = 0;
std::ostringstream windowHndStr;
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
mInputManager = OIS::InputManager::createInputSystem( pl );
//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)
mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, true ));
mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, true ));
try {
mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject( OIS::OISJoyStick, true ));
}
catch(...) {
mJoy = 0;
}
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
//Set initial mouse clipping size
windowResized(mWindow);
//Register as a Window listener
WindowEventUtilities::addWindowEventListener(mWindow, this);
}
void windowResized(RenderWindow* rw)
{
unsigned int width, height, depth;
int left, top;
rw->getMetrics(width, height, depth, left, top);
const OIS::MouseState &ms = mMouse->getMouseState();
ms.width = width;
ms.height = height;
}
//Unattach OIS before window shutdown (very important under Linux)
void windowClosed(RenderWindow* rw)
{
//Only close for window that created OIS (the main window in these demos)
if( rw == mWindow )
{
if( mInputManager )
{
mInputManager->destroyInputObject( mMouse );
mInputManager->destroyInputObject( mKeyboard );
mInputManager->destroyInputObject( mJoy );
OIS::InputManager::destroyInputSystem(mInputManager);
mInputManager = 0;
}
}
}
~GameMainFrameListener()
{
WindowEventUtilities::removeWindowEventListener(mWindow, this);
windowClosed(mWindow);
}
bool frameStarted(const FrameEvent &evt)
{
if(mShutdownRequested) return false;
if(mWindow->isClosed()) return false;
//Need to capture/update each device
mKeyboard->capture();
mMouse->capture();
if( mJoy ) mJoy->capture();
return true;
}
virtual bool mouseMoved( const OIS::MouseEvent &arg )
{
//判断当前鼠标的位置是否超出Ogre的窗口。
if(arg.state.X.abs < mWindow->getViewport(0)->getActualLeft()+1
||(arg.state.Y.abs < mWindow->getViewport(0)->getActualTop()+1)
||(arg.state.X.abs > mWindow->getViewport(0)->getActualLeft()+mWindow->getViewport(0)->getActualWidth())
||(arg.state.Y.abs > mWindow->getViewport(0)->getActualTop() +mWindow->getViewport(0)->getActualHeight()))
{
if( !mSysMouseShowFlag)
{
ShowCursor(1);
CEGUI::MouseCursor::getSingleton().hide();
mSysMouseShowFlag = true;
}
}
else
{
if( mSysMouseShowFlag)
{
ShowCursor(0);
CEGUI::MouseCursor::getSingleton().show();
mSysMouseShowFlag = false;
}
}
CEGUI::System::getSingleton().injectMousePosition( arg.state.X.abs, arg.state.Y.abs );
return true;
}
//----------------------------------------------------------------//
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
CEGUI::System::getSingleton().injectMouseButtonDown(convertOISMouseButtonToCegui(id));
return true;
}
//----------------------------------------------------------------//
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
CEGUI::System::getSingleton().injectMouseButtonUp(convertOISMouseButtonToCegui(id));
return true;
}
//----------------------------------------------------------------//
virtual bool keyPressed( const OIS::KeyEvent &arg )
{
if( arg.key == OIS::KC_ESCAPE )
mShutdownRequested = true;
CEGUI::System::getSingleton().injectKeyDown( arg.key );
CEGUI::System::getSingleton().injectChar( arg.text );
return true;
}
//----------------------------------------------------------------//
virtual bool keyReleased( const OIS::KeyEvent &arg )
{
CEGUI::System::getSingleton().injectKeyUp( arg.key );
return true;
}
};
网上有一篇“
转自:http://hi.baidu.com/ton666/blog/item/84b892a133f62687461064c8.html 使用后效果很好~哈
//用于在OIS和CEGUI之间转换鼠标
CEGUI::MouseButton convertOISMouseButtonToCegui(int buttonID)
{
switch (buttonID)
{
case 0: return CEGUI::LeftButton;
case 1: return CEGUI::RightButton;
case 2: return CEGUI::MiddleButton;
case 3: return CEGUI::X1Button;
default: return CEGUI::LeftButton;
}
}
// Event handler to add ability to alter curvature
class GameMainFrameListener : public Ogre::FrameListener, public WindowEventListener,public OIS::KeyListener,public OIS::MouseListener
{
protected:
RenderWindow* mWindow;
Camera* mCamera;
SceneManager* mSceneMgr;
//OIS Input devices
OIS::InputManager* mInputManager;
OIS::Mouse* mMouse;
OIS::Keyboard* mKeyboard;
OIS::JoyStick* mJoy;
bool mShutdownRequested;
bool mSysMouseShowFlag;
public:
GameMainFrameListener(RenderWindow* win, Camera* cam, SceneManager* mgr)
: mWindow(win),
mCamera(cam),
mSceneMgr(mgr),
mInputManager(0), mMouse(0), mKeyboard(0), mJoy(0)
{
mShutdownRequested = false;
mSysMouseShowFlag = false;
ShowCursor(0);
LogManager::getSingletonPtr()->logMessage("*** Initializing OIS ***");
OIS::ParamList pl;
size_t windowHnd = 0;
std::ostringstream windowHndStr;
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
mInputManager = OIS::InputManager::createInputSystem( pl );
//Create all devices (We only catch joystick exceptions here, as, most people have Key/Mouse)
mKeyboard = static_cast<OIS::Keyboard*>(mInputManager->createInputObject( OIS::OISKeyboard, true ));
mMouse = static_cast<OIS::Mouse*>(mInputManager->createInputObject( OIS::OISMouse, true ));
try {
mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject( OIS::OISJoyStick, true ));
}
catch(...) {
mJoy = 0;
}
mMouse->setEventCallback(this);
mKeyboard->setEventCallback(this);
//Set initial mouse clipping size
windowResized(mWindow);
//Register as a Window listener
WindowEventUtilities::addWindowEventListener(mWindow, this);
}
void windowResized(RenderWindow* rw)
{
unsigned int width, height, depth;
int left, top;
rw->getMetrics(width, height, depth, left, top);
const OIS::MouseState &ms = mMouse->getMouseState();
ms.width = width;
ms.height = height;
}
//Unattach OIS before window shutdown (very important under Linux)
void windowClosed(RenderWindow* rw)
{
//Only close for window that created OIS (the main window in these demos)
if( rw == mWindow )
{
if( mInputManager )
{
mInputManager->destroyInputObject( mMouse );
mInputManager->destroyInputObject( mKeyboard );
mInputManager->destroyInputObject( mJoy );
OIS::InputManager::destroyInputSystem(mInputManager);
mInputManager = 0;
}
}
}
~GameMainFrameListener()
{
WindowEventUtilities::removeWindowEventListener(mWindow, this);
windowClosed(mWindow);
}
bool frameStarted(const FrameEvent &evt)
{
if(mShutdownRequested) return false;
if(mWindow->isClosed()) return false;
//Need to capture/update each device
mKeyboard->capture();
mMouse->capture();
if( mJoy ) mJoy->capture();
return true;
}
virtual bool mouseMoved( const OIS::MouseEvent &arg )
{
//判断当前鼠标的位置是否超出Ogre的窗口。
if(arg.state.X.abs < mWindow->getViewport(0)->getActualLeft()+1
||(arg.state.Y.abs < mWindow->getViewport(0)->getActualTop()+1)
||(arg.state.X.abs > mWindow->getViewport(0)->getActualLeft()+mWindow->getViewport(0)->getActualWidth())
||(arg.state.Y.abs > mWindow->getViewport(0)->getActualTop() +mWindow->getViewport(0)->getActualHeight()))
{
if( !mSysMouseShowFlag)
{
ShowCursor(1);
CEGUI::MouseCursor::getSingleton().hide();
mSysMouseShowFlag = true;
}
}
else
{
if( mSysMouseShowFlag)
{
ShowCursor(0);
CEGUI::MouseCursor::getSingleton().show();
mSysMouseShowFlag = false;
}
}
CEGUI::System::getSingleton().injectMousePosition( arg.state.X.abs, arg.state.Y.abs );
return true;
}
//----------------------------------------------------------------//
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
CEGUI::System::getSingleton().injectMouseButtonDown(convertOISMouseButtonToCegui(id));
return true;
}
//----------------------------------------------------------------//
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id )
{
CEGUI::System::getSingleton().injectMouseButtonUp(convertOISMouseButtonToCegui(id));
return true;
}
//----------------------------------------------------------------//
virtual bool keyPressed( const OIS::KeyEvent &arg )
{
if( arg.key == OIS::KC_ESCAPE )
mShutdownRequested = true;
CEGUI::System::getSingleton().injectKeyDown( arg.key );
CEGUI::System::getSingleton().injectChar( arg.text );
return true;
}
//----------------------------------------------------------------//
virtual bool keyReleased( const OIS::KeyEvent &arg )
{
CEGUI::System::getSingleton().injectKeyUp( arg.key );
return true;
}
};
网上有一篇“
OGRE+CEGUI+OIS 完美解决鼠标非独占使用
”的文章,写的很好。但是按照他的方法会有个问题,就是鼠标在窗口边框的时候没有指针。这时要用到ShowCursor(1);,但是要与ShowCursor(0);交互使用,因为ShowCursor函数是加1减1,加到大于等于1是才显示鼠标指针,小于1就不显示。这就为什么ShowCursor(1);有时看上去会没有作用。转自:http://hi.baidu.com/ton666/blog/item/84b892a133f62687461064c8.html 使用后效果很好~哈
相关文章推荐
- OGRE+CEGUI+OIS 完美解决鼠标非独占使用
- OGRE+CEGUI+OIS 完美解决鼠标非独占使用
- OGRE+CEGUI+OIS 完美解决鼠标非独占使用
- OGRE+CEGUI+OIS 完美解决鼠标非独占使用
- OGRE+CEGUI+OIS鼠标无法移出窗口解决方案
- OGRE使用OIS鼠标不准确问题
- OGRE+OIS+CEGUI解决双鼠标问题
- OGRE 1.7 鼠标非独占使用(鼠标移出当前窗口)
- CEGUI OGRE ISO中文显示输入整合,鼠标独占问题,窗口创建
- OGRE的2D坐标、CEGUI坐标、鼠标坐标
- 从OGRE纹理到CEGUI纹理 —— 使用RTT实现3D角色预览
- 在OGRE中使用CEGUI
- Ogre1.7.x中使用CEGUI的变化
- MAC OSX10.9 下编译使用OGRE1.9及CEGUI 0.8.3(二)OGRE Templates的使用
- OGRE中使用CEGUI【1】
- 从OGRE纹理到CEGUI纹理 —— 使用RTT实现3D角色预览
- OGRE中OIS与CEGUI的屏幕坐标转换
- 最简单的Ogre系列之三——添加鼠标(不使用任何GUI)
- OGRE的2D坐标、CEGUI坐标、鼠标坐标、 世界坐标转屏幕坐标
- OGRE中OIS与CEGUI的屏幕坐标转换