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

posted @ 2011-05-03 15:09  橘子小酥  阅读(499)  评论(0编辑  收藏  举报