⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inputhandler.cpp

📁 坦克大战
💻 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 + -