FrameListener:
class
Example25FrameListener :
public
Ogre::FrameListener // 帧监听
{
private :
Ogre::SceneNode * _node;
public :
Example25FrameListener(Ogre::SceneNode * node)
{
_node = node;
}
bool frameStarted( const Ogre::FrameEvent & evt) // 每一帧开始前所做的工作
{
_node -> translate(Ogre::Vector3( 0.1 , 0 , 0 )); // 每帧移动0.1, 会因机器速度的不同而不同
{
private :
Ogre::SceneNode * _node;
public :
Example25FrameListener(Ogre::SceneNode * node)
{
_node = node;
}
bool frameStarted( const Ogre::FrameEvent & evt) // 每一帧开始前所做的工作
{
_node -> translate(Ogre::Vector3( 0.1 , 0 , 0 )); // 每帧移动0.1, 会因机器速度的不同而不同
// _node->translate(Ogre::Vector3(10,0,0) * evt.timeSinceLastFrame); 每秒移动10, 不论什么机器
return true ;
}
};
return true ;
}
};
获得窗口句柄:
size_t windowHnd
=
0
;
std::stringstream windowHndStr;
win -> getCustomAttribute( " WINDOW " , & windowHnd);
windowHndStr << windowHnd; // OIS所需的字符串流
std::stringstream windowHndStr;
win -> getCustomAttribute( " WINDOW " , & windowHnd);
windowHndStr << windowHnd; // OIS所需的字符串流
创建参数列表:
OIS::ParamList pl;
pl.insert(std::make_pair(std:: string ( " WINDOW " ), windowHndStr.str()));
pl.insert(std::make_pair(std:: string ( " WINDOW " ), windowHndStr.str()));
通过参数列表创建输入系统:
_man
=
OIS::InputManager::createInputSystem( pl );
_key = static_cast < OIS::Keyboard *> (_man -> createInputObject( OIS::OISKeyboard, false )); // 建立键盘接口
_key = static_cast < OIS::Keyboard *> (_man -> createInputObject( OIS::OISKeyboard, false )); // 建立键盘接口
// _mouse = static_cast<OIS::Mouse*>(_man->createInputObject( OIS::OISMouse, false )); 建立鼠标接口
捕获键盘输入:
bool
frameStarted(
const
Ogre::FrameEvent
&
evt)
{
_node -> translate(Ogre::Vector3( 10 , 0 , 0 ) * evt.timeSinceLastFrame);
_key -> capture(); // 捕获键盘输入
if (_key -> isKeyDown(OIS::KC_ESCAPE))
{
return false ;
}
return true ;
}
{
_node -> translate(Ogre::Vector3( 10 , 0 , 0 ) * evt.timeSinceLastFrame);
_key -> capture(); // 捕获键盘输入
if (_key -> isKeyDown(OIS::KC_ESCAPE))
{
return false ;
}
return true ;
}
鼠标输入:
float
rotX
=
_mouse
->
getMouseState().X.rel
*
evt.timeSinceLastFrame
*
-
1
;
float rotY = _mouse -> getMouseState().Y.rel * evt.timeSinceLastFrame * - 1 ;
// getMouseState().X.rel用来获取在X方向上鼠标相对上一帧移动的距离
float rotY = _mouse -> getMouseState().Y.rel * evt.timeSinceLastFrame * - 1 ;
// getMouseState().X.rel用来获取在X方向上鼠标相对上一帧移动的距离
图形模式:
if
(_key
->
isKeyDown(OIS::KC_R)&& _timer.getMilliseconds() > 250) // _timer.getMilliseconds()设置计时器
{
{
_timer.reset(); // 重置计时器
if (_PolyMode == PM_SOLID)
{
_PolyMode = Ogre::PolygonMode::PM_WIREFRAME; // 线框模式
}
else if (_PolyMode == PM_WIREFRAME)
{
_PolyMode = Ogre::PolygonMode::PM_POINTS; // 顶点模式
}
else if (_PolyMode == PM_POINTS)
{
_PolyMode = Ogre::PolygonMode::PM_SOLID; // 图形模式
}
_Cam -> setPolygonMode(_PolyMode);
}
if (_PolyMode == PM_SOLID)
{
_PolyMode = Ogre::PolygonMode::PM_WIREFRAME; // 线框模式
}
else if (_PolyMode == PM_WIREFRAME)
{
_PolyMode = Ogre::PolygonMode::PM_POINTS; // 顶点模式
}
else if (_PolyMode == PM_POINTS)
{
_PolyMode = Ogre::PolygonMode::PM_SOLID; // 图形模式
}
_Cam -> setPolygonMode(_PolyMode);
}
另一种控制按键响应的方法:
if
(_key
->
isKeyDown(OIS::KC_R)
&&
!
_pressedBefore)
{
_pressedBefore = true ;
if (_PolyMode == PM_SOLID)
{
_PolyMode = Ogre::PolygonMode::PM_WIREFRAME;
}
else if (_PolyMode == PM_WIREFRAME)
{
_PolyMode = Ogre::PolygonMode::PM_POINTS;
}
else if (_PolyMode == PM_POINTS)
{
_PolyMode = Ogre::PolygonMode::PM_SOLID;
}
_Cam -> setPolygonMode(_PolyMode);
}
if ( ! _key -> isKeyDown(OIS::KC_R))
{
_pressedBefore = false ;
}
{
_pressedBefore = true ;
if (_PolyMode == PM_SOLID)
{
_PolyMode = Ogre::PolygonMode::PM_WIREFRAME;
}
else if (_PolyMode == PM_WIREFRAME)
{
_PolyMode = Ogre::PolygonMode::PM_POINTS;
}
else if (_PolyMode == PM_POINTS)
{
_PolyMode = Ogre::PolygonMode::PM_SOLID;
}
_Cam -> setPolygonMode(_PolyMode);
}
if ( ! _key -> isKeyDown(OIS::KC_R))
{
_pressedBefore = false ;
}