您的位置:首页 > 产品设计 > UI/UE

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;
}

};

网上有一篇“

OGRE+CEGUI+OIS 完美解决鼠标非独占使用

”的文章,写的很好。但是按照他的方法会有个问题,就是鼠标在窗口边框的时候没有指针。这时要用到ShowCursor(1);,但是要与ShowCursor(0);交互使用,因为ShowCursor函数是加1减1,加到大于等于1是才显示鼠标指针,小于1就不显示。这就为什么ShowCursor(1);有时看上去会没有作用。

转自:http://hi.baidu.com/ton666/blog/item/84b892a133f62687461064c8.html 使用后效果很好~哈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: