作者: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);
}
