?? inputhandler.cpp
字號:
#include <Ogre.h>
#include <OIS/OIS.h>
#include <CEGUI/CEGUI.h>
#include <OgreCEGUIRenderer.h>
#include "NxOgre.h"
#include "InputHandler.h"
using namespace Ogre;
using namespace NxOgre;
InputHandler::InputHandler(OIS::Keyboard *keyboard, OIS::Mouse *mouse, Application *app)
: mKeyboard(keyboard),mMouse(mouse),mApp(app)
{
// key and mouse state tracking
mMouseDown = false;
mToggle = 0.0;
// set the rotation and move speed
mRotate = 0.10;
mMove = 200;
currentCameraHandler = static_cast<CameraHandle> (&InputHandler::freeCameraHandle);
}
bool InputHandler::frameStarted(const FrameEvent& evt)
{
mMouse->capture();
mKeyboard->capture();
// 控制攝像機
//cameraHandle(evt);
if(currentCameraHandler)
(this->*currentCameraHandler)(evt);
// 控制玩家
playerHandle(evt);
// 切換視角
switchViewHandle(evt);
// 若是追蹤模式, 調整攝像機
if(mApp->mViewType == mApp->BACK || mApp->mViewType == mApp->FRONT)
adjustCamera();
return !mKeyboard->isKeyDown(OIS::KC_ESCAPE);
}
bool InputHandler::freeCameraHandle(const FrameEvent& evt)
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
Vector3 transVector = Vector3::ZERO;
if (mKeyboard->isKeyDown(OIS::KC_UP))
transVector.z -= mMove;
if (mKeyboard->isKeyDown(OIS::KC_DOWN))
transVector.z += mMove;
if (mKeyboard->isKeyDown(OIS::KC_LEFT))
transVector.x -= mMove;
if (mKeyboard->isKeyDown(OIS::KC_RIGHT))
transVector.x += mMove;
if (mKeyboard->isKeyDown(OIS::KC_PGUP))
transVector.y += mMove;
if (mKeyboard->isKeyDown(OIS::KC_PGDOWN))
transVector.y -= mMove;
mCamNode->translate(transVector * evt.timeSinceLastFrame, Node::TS_LOCAL);
if (mMouse->getMouseState().buttonDown(OIS::MB_Right))
{
mCamNode->yaw(Degree(-mRotate * mMouse->getMouseState().X.rel), Node::TS_WORLD);
mCamNode->pitch(Degree(-mRotate * mMouse->getMouseState().Y.rel), Node::TS_LOCAL);
}
return true;
}
bool InputHandler::wowCameraHandle(const FrameEvent& evt)
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
Vector3 transVector = Vector3::ZERO;
if (mMouse->getMouseState().buttonDown(OIS::MB_Right))
{
Quaternion q;
q.FromAngleAxis(Degree(-mRotate * mMouse->getMouseState().X.rel),Vector3::UNIT_Y);
mCamNode->setPosition(q * mCamNode->getPosition());
q.FromAngleAxis(Degree(mRotate * mMouse->getMouseState().Y.rel),Vector3::UNIT_Z);
mCamNode->setPosition(q * mCamNode->getPosition());
}
return true;
}
bool InputHandler::playerHandle(const FrameEvent& evt)
{
Vector3 velocity = mApp->mScene->getActor("player")->getLinearVelocity();
Real speed = Math::Sqrt(velocity.x * velocity.x + velocity.y * velocity.y + velocity.z * velocity.z);
if(speed < 1)
speed = 10;
Vector3 angular = mApp->mScene->getActor("player")->getAngularVelocity();
Real angularSpeed = Math::Sqrt(angular.x * angular.x + angular.y * angular.y + angular.z * angular.z);
if(angularSpeed < 1)
angularSpeed = 2;
// 控制角色
if (mKeyboard->isKeyDown(OIS::KC_W))
mApp->mScene->getActor("player")->addLocalForce(Vector3(-700000,0,0) * evt.timeSinceLastFrame / speed);
if (mKeyboard->isKeyDown(OIS::KC_S))
mApp->mScene->getActor("player")->addLocalForce(Vector3(700000,0,0) * evt.timeSinceLastFrame / speed);
if (mKeyboard->isKeyDown(OIS::KC_D))
{
mApp->mScene->getActor("player")->addLocalTorque(Vector3(0,-300000,0) * evt.timeSinceLastFrame / angularSpeed);
}
if (mKeyboard->isKeyDown(OIS::KC_A))
{
mApp->mScene->getActor("player")->addLocalTorque(Vector3(0,300000,0) * evt.timeSinceLastFrame / angularSpeed);
}
return true;
}
bool InputHandler::switchViewHandle(const FrameEvent& evt)
{
// F7 -- 自由視角
if (mKeyboard->isKeyDown(OIS::KC_F7))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraFree");
mCamNode->attachObject(mApp->mCamera);
mApp->mCamera->setAutoTracking(false);
mApp->mCamera->setOrientation(Quaternion::IDENTITY);
mApp->mViewType = mApp->FREE;
currentCameraHandler = static_cast<CameraHandle> (&InputHandler::freeCameraHandle);
}
// F8 -- WOW視角
else if (mKeyboard->isKeyDown(OIS::KC_F8))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraTrace");
mCamNode->setPosition(Vector3(30, 15, 0));
mCamNode->attachObject(mApp->mCamera);
mApp->mCamera->setAutoTracking(true,mCamNode->getParentSceneNode());
mApp->mViewType = mApp->WOW;
currentCameraHandler = static_cast<CameraHandle> (&InputHandler::wowCameraHandle);
}
// F9 -- 內部視角
else if (mKeyboard->isKeyDown(OIS::KC_F9))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraTrace");
mCamNode->setPosition(Vector3(0, 5, 4));
mApp->mCamera->setAutoTracking(false);
mApp->mCamera->setOrientation(Quaternion::IDENTITY);
Quaternion q;
q.FromAngleAxis(Degree(85),Vector3::UNIT_Y);
mCamNode->setOrientation(q);
mCamNode->attachObject(mApp->mCamera);
mApp->mViewType = mApp->INTERNAL;
currentCameraHandler = 0;
}
// F10 -- 前置視角
else if (mKeyboard->isKeyDown(OIS::KC_F10))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraTrace");
mCamNode->setPosition(Vector3(-30, 15, 0));
mCamNode->attachObject(mApp->mCamera);
mApp->mCamera->setAutoTracking(true,mCamNode->getParentSceneNode());
mApp->mViewType = mApp->FRONT;
currentCameraHandler = 0;
}
// F11 -- 后置視角
else if (mKeyboard->isKeyDown(OIS::KC_F11))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraTrace");
mCamNode->setPosition(Vector3(30, 15, 0));
mCamNode->attachObject(mApp->mCamera);
mApp->mCamera->setAutoTracking(true,mCamNode->getParentSceneNode());
mApp->mViewType = mApp->BACK;
currentCameraHandler = 0;
}
// F12 -- 飛躍視角
else if (mKeyboard->isKeyDown(OIS::KC_F12))
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
SceneNode* playerNode = static_cast<OgreNodeRenderable*>(static_cast<Body*>(mApp->mScene->getActor("player"))->getRenderable())->getNode();
mApp->mCamera->getParentSceneNode()->detachObject((unsigned short)0);
mCamNode = mApp->mSceneMgr->getSceneNode("CameraFlyBy");
mCamNode->setPosition(playerNode->getWorldPosition()
+ playerNode->getOrientation() * Quaternion(Degree(30),Vector3::UNIT_Y) * Vector3(-100,20,0));
mCamNode->attachObject(mApp->mCamera);
mApp->mCamera->setAutoTracking(true,playerNode);
mApp->mViewType = mApp->FLY_BY;
currentCameraHandler = 0;
}
return true;
}
void InputHandler::adjustCamera()
{
SceneNode* mCamNode = mApp->mCamera->getParentSceneNode();
SceneNode* playerNode = static_cast<OgreNodeRenderable*>(static_cast<Body*>(mApp->mScene->getActor("player"))->getRenderable())->getNode();
Vector3 direction = playerNode->getOrientation() * Vector3::UNIT_X;
Vector3 velocity = mApp->mScene->getActor("player")->getLinearVelocity();
Vector3 angular = mApp->mScene->getActor("player")->getAngularVelocity();
Real speed = velocity.dotProduct(direction);
Real angularSpeed = angular.length();
if( speed < 0.3 )
speed = 0;
if( angularSpeed < 0.5 )
angularSpeed = 0;
Real adjustDistance = speed * 2;
if( adjustDistance < -20 )
adjustDistance = -20;
else if( adjustDistance > 50 )
adjustDistance = 50;
Real adjustYew = angularSpeed * 0.5;
if( adjustYew > 1 )
adjustYew = 1;
Radian ajust_yew(adjustYew);
if( mApp->mViewType == mApp->FRONT )
{
mCamNode->setPosition(Vector3( 30 - adjustDistance, 15, 0 ));
Quaternion q;
q.FromAngleAxis(-ajust_yew,Vector3::UNIT_Y);
mCamNode->setPosition(q * mCamNode->getPosition());
}
if( mApp->mViewType == mApp->BACK )
{
mCamNode->setPosition(Vector3( - 30 + adjustDistance, 15, 0 ));
Quaternion q;
q.FromAngleAxis(ajust_yew,Vector3::UNIT_Y);
mCamNode->setPosition(q * mCamNode->getPosition());
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -