Ogre笔记(3)

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, 会因机器速度的不同而不同
     // _node->translate(Ogre::Vector3(10,0,0) * evt.timeSinceLastFrame); 每秒移动10, 不论什么机器
return true ;
}
};

获得窗口句柄:

 
  
size_t windowHnd = 0 ;
std::stringstream windowHndStr;

win
-> getCustomAttribute( " WINDOW " , & windowHnd);
windowHndStr
<< windowHnd;    // OIS所需的字符串流

创建参数列表:

 
  
OIS::ParamList pl;
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 )); // 建立键盘接口
// _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 ;
}

鼠标输入:

 
  
float rotX = _mouse -> getMouseState().X.rel * evt.timeSinceLastFrame * - 1 ;
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 (_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 ;
}

转载于:https://www.cnblogs.com/elite/articles/2035319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值