Ogre键盘输入控制人物和相机

// ogre.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include "Ogre/ExampleApplication.h"
class MyFrameListener :public Ogre::FrameListener
{
private:
Ogre::SceneNode* _node;
OIS::InputManager* _man;
OIS::Keyboard* _key;
Ogre::Entity* _ent;
Ogre::AnimationState* _anistate;
OIS::Mouse* _mouse;
Ogre::Camera* _cam;
Ogre::Camera* _camold;//存储初始相机
Ogre::Camera* _cam1;
Ogre::Camera* _cam2;
Ogre::Camera* _cam3;
Ogre::Timer timer;
float _movementspeed;
public:
MyFrameListener(Ogre::SceneNode* node, RenderWindow* win, Ogre::Entity* sinbad, Camera* cam, Camera* cam1, Camera* cam2, Camera* cam3)
{
_node = node;
timer.reset();
_cam = cam;
_ent = sinbad;
_anistate = _ent->getAnimationState("Dance");
_anistate->setEnabled(true);
_anistate->setLoop(true);
_camold = _cam;
_cam1 = cam1;
_cam2 = cam2;
_cam3 = cam3;
_movementspeed = 1.0f;
size_t windowHnd = 0;
std::stringstream windowHndStr;
win->getCustomAttribute("WINDOW", &windowHnd);
windowHndStr << windowHnd;
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));
}
~MyFrameListener()
{
_man->destroyInputObject(_key);
_man->destroyInputObject(_mouse);
OIS::InputManager::destroyInputSystem(_man);
}
bool frameStarted(const Ogre::FrameEvent& evt)
{
_anistate->addTime(evt.timeSinceLastFrame);
Ogre::Vector3 trans = Vector3(0, 0, 0);
_key->capture();
_mouse->capture();
float rotX = _mouse->getMouseState().X.rel * evt.timeSinceLastFrame* -1;
float rotY = _mouse->getMouseState().Y.rel * evt.timeSinceLastFrame * -1;


if (_key->isKeyDown(OIS::KC_W))
trans += Ogre::Vector3(0, 0, -10);
if (_key->isKeyDown(OIS::KC_S))
trans += Ogre::Vector3(0, 0, 10);
if (_key->isKeyDown(OIS::KC_A))
trans += Ogre::Vector3(-10, 0, 0);
if (_key->isKeyDown(OIS::KC_D))
trans += Ogre::Vector3(10, 0, 0);
_cam->yaw(Ogre::Radian(rotX));
_cam->pitch(Ogre::Radian(rotY));
_cam->moveRelative(trans*evt.timeSinceLastFrame * _movementspeed);
//_node->translate(trans*evt.timeSinceLastFrame);
if (_key->isKeyDown(OIS::KC_TAB) && timer.getMilliseconds()>250)//TAB切换相机
{
if (_cam == _camold)
_cam = _cam1;
else if (_cam == _cam1)
_cam = _cam2;
else if (_cam == _cam2)
_cam = _cam3;
else if (_cam == _cam3)
_cam = _camold;
timer.reset();
}
if (_key->isKeyDown(OIS::KC_ESCAPE))
{
return false;
}
(void)evt;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值