Ogre角色控制类(源码)

来源:互联网 发布:windows gcc下载 编辑:程序博客网 时间:2024/05/16 02:20

作者:CYM

首先写一个基类,里面的成员函数都是纯虚函数,以及几个通用的成员变量

//------------------------------------//作者:CYM//时间:2012/03/08//描述:游戏角色类//------------------------------------#pragma once#include "GameDefine.h"using namespace Ogre;using namespace OIS;class CCYMCharacter{public:CCYMCharacter(void);~CCYMCharacter(void);virtual void Create(Ogre::String& name,Ogre::SceneManager* sm)=0;virtual void Close(void)=0;virtual bool Render(float deltaTime)=0;virtual void InjectKeyDown(const OIS::KeyEvent &arg)=0;virtual void InjectKeyUp(const OIS::KeyEvent &arg)=0;virtual void InjectMouseDown(const OIS::MouseEvent &arg, OIS::MouseButtonID id)=0;virtual void InjectMouseUp(const OIS::MouseEvent &arg, OIS::MouseButtonID id)=0;virtual void InjectMouseMove(const OIS::MouseEvent &arg)=0;protected://移动状态bool m_isMove;bool m_isForward;bool m_isBack;bool m_isLefting;bool m_isRighting;//移动速度Ogre::Real m_forwardSpeed;Ogre::Real m_backSpeed;Ogre::Real m_leftSpeed;Ogre::Real m_rightSpeed;Ogre::Entity* m_entity;Ogre::SceneNode* m_node;Ogre::AnimationStateSet* m_aniStateSet;};

//------------------------------------//作者:CYM//时间:2012/03/08//描述:游戏角色类//------------------------------------#include "CYMCharacter.h"using namespace Ogre;using namespace OIS;CCYMCharacter::CCYMCharacter(void){//移动状态m_isMove=false;m_isForward=false;m_isBack=false;m_isLefting=false;m_isRighting=false;//移动速度m_forwardSpeed=0.1f;m_backSpeed=-0.1f;m_leftSpeed=-0.1f;m_rightSpeed=0.1f;m_entity=NULL;m_node=NULL;m_aniStateSet=NULL;}CCYMCharacter::~CCYMCharacter(void){}


接着从上面这个基类派生出一个角色控制类

//------------------------------------//作者:CYM//时间:2012/03/09//描述:游戏角色类(人类)//------------------------------------#pragma once#include "CYMCharacter.h"class CCYMCharacterHuman:public CCYMCharacter{public:CCYMCharacterHuman(void);~CCYMCharacterHuman(void);virtual void Create(Ogre::String& name,Ogre::SceneManager* sm);virtual void Close(void);virtual bool Render(float deltaTime);virtual void InjectKeyDown(const OIS::KeyEvent &arg);virtual void InjectKeyUp(const OIS::KeyEvent &arg);virtual void InjectMouseDown(const OIS::MouseEvent &arg, OIS::MouseButtonID id);virtual void InjectMouseUp(const OIS::MouseEvent &arg, OIS::MouseButtonID id);virtual void InjectMouseMove(const OIS::MouseEvent &arg);private://骨骼动画状态Ogre::AnimationState* m_Dance;Ogre::AnimationState* m_DrawSwords;Ogre::AnimationState* m_HandsClose;Ogre::AnimationState* m_HandsRelaxed;Ogre::AnimationState* m_IdleBase;Ogre::AnimationState* m_IdleTop;Ogre::AnimationState* m_JumpEnd;Ogre::AnimationState* m_JumpLoop;Ogre::AnimationState* m_JumpStart;Ogre::AnimationState* m_RunBase;Ogre::AnimationState* m_RunTop;Ogre::AnimationState* m_SliceHorizontal;Ogre::AnimationState* m_SliceVertical;};

//------------------------------------//作者:CYM//时间:2012/03/09//描述:游戏角色类(人类)//------------------------------------#include "CYMCharacterHuman.h"CCYMCharacterHuman::CCYMCharacterHuman(void){//骨骼动画状态m_Dance=NULL;m_DrawSwords=NULL;m_HandsClose=NULL;m_HandsRelaxed=NULL;m_IdleBase=NULL;m_IdleTop=NULL;m_JumpEnd=NULL;m_JumpLoop=NULL;m_JumpStart=NULL;m_RunBase=NULL;m_RunTop=NULL;m_SliceHorizontal=NULL;m_SliceVertical=NULL;//sg_root->addFrameListener(this);}CCYMCharacterHuman::~CCYMCharacterHuman(void){}void CCYMCharacterHuman::Create(Ogre::String& name,Ogre::SceneManager* sm){if(sm==NULL){::MessageBox(NULL,"场景管理为空","错误",NULL);}m_entity=sm->createEntity(name);m_node=sm->getRootSceneNode()->createChildSceneNode();m_node->attachObject(m_entity);m_node->setPosition(0.0f,0.0f,0.0f);m_aniStateSet=m_entity->getAllAnimationStates();//获取动画状态m_Dance=m_aniStateSet->getAnimationState("Dance");m_Dance->setLoop(true);m_DrawSwords=m_aniStateSet->getAnimationState("DrawSwords");m_DrawSwords->setLoop(false);//m_HandsClose=m_aniStateSet->getAnimationState("HandsClose");//m_HandsRelaxed=m_aniStateSet->getAnimationState("HandsRelaxed");m_IdleBase=m_aniStateSet->getAnimationState("IdleBase");m_IdleBase->setLoop(true);m_IdleTop=m_aniStateSet->getAnimationState("IdleTop");m_IdleTop->setLoop(true);m_IdleBase->setEnabled(true);m_IdleTop->setEnabled(true);m_JumpEnd=m_aniStateSet->getAnimationState("JumpEnd");m_JumpLoop=m_aniStateSet->getAnimationState("JumpLoop");m_JumpLoop->setLoop(true);m_JumpStart=m_aniStateSet->getAnimationState("JumpStart");m_RunBase=m_aniStateSet->getAnimationState("RunBase");m_RunBase->setLoop(true);m_RunTop=m_aniStateSet->getAnimationState("RunTop");m_RunTop->setLoop(true);m_SliceHorizontal=m_aniStateSet->getAnimationState("SliceHorizontal");m_SliceVertical=m_aniStateSet->getAnimationState("SliceVertical");}void CCYMCharacterHuman::Close(void){}bool CCYMCharacterHuman::Render(float deltaTime){if(m_isMove){if(m_isForward){m_node->translate(0.0f,0.0f,m_forwardSpeed,Node::TS_LOCAL);}if(m_isBack){m_node->translate(0.0f,0.0f,m_backSpeed,Node::TS_LOCAL);}if(m_isLefting){m_node->translate(m_leftSpeed,0.0f,0.0f,Node::TS_LOCAL);}if(m_isRighting){m_node->translate(m_rightSpeed,0.0f,0.0f,Node::TS_LOCAL);}m_RunTop->addTime(deltaTime);m_RunBase->addTime(deltaTime);}return true;}void CCYMCharacterHuman::InjectKeyDown(const OIS::KeyEvent &arg){if(arg.key==OIS::KC_A||arg.key==OIS::KC_D||arg.key==OIS::KC_W||arg.key==OIS::KC_S){m_isMove=true;//行走状态if(arg.key==OIS::KC_A && m_isLefting!=true){m_isLefting=true;}if(arg.key==OIS::KC_D && m_isRighting!=true){m_isRighting=true;}if(arg.key==OIS::KC_W && m_isForward!=true){m_isForward=true;}if(arg.key==OIS::KC_S && m_isBack!=true){m_isBack=true;}m_RunBase->setEnabled(true);m_RunTop->setEnabled(true);}}void CCYMCharacterHuman::InjectKeyUp(const OIS::KeyEvent &arg){if(arg.key==OIS::KC_A||arg.key==OIS::KC_D||arg.key==OIS::KC_W||arg.key==OIS::KC_S){//行走妆台if(arg.key==OIS::KC_A && m_isLefting!=false){m_isLefting=false;}if(arg.key==OIS::KC_D && m_isRighting!=false){m_isRighting=false;}if(arg.key==OIS::KC_W && m_isForward!=false){m_isForward=false;}if(arg.key==OIS::KC_S && m_isBack!=false){m_isBack=false;}}if(m_isLefting==false && m_isRighting==false && m_isForward==false && m_isBack==false){m_isMove=false;m_RunBase->setEnabled(false);m_RunTop->setEnabled(false);}}void CCYMCharacterHuman::InjectMouseDown(const OIS::MouseEvent &arg, OIS::MouseButtonID id){}void CCYMCharacterHuman::InjectMouseUp(const OIS::MouseEvent &arg, OIS::MouseButtonID id){}void CCYMCharacterHuman::InjectMouseMove(const OIS::MouseEvent &arg){//旋转角色m_node->yaw(Ogre::Degree(arg.state.X.rel),Ogre::Node::TS_LOCAL);}



原创粉丝点击