Ogre角色控制类(源码)

本文介绍了一个游戏角色控制类的设计实现,包括角色移动、动画状态管理和键盘鼠标输入处理等关键功能。通过继承基类并实现具体方法,使得角色在游戏中能够响应用户的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值