作者:CYM
这里将简单的实现一个第三人称的角色控制
首先写一个基类,这个基类生么也不做,只是确定一些通用的函数可和成员变量,也就是说这个基类都是纯虚函数
这个类的成员函数主要是处理鼠标和键盘的输入,然后更改角色的状态,Render()函数在根据状态来渲染相应的动画
以下几个是
- 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;
以下几个是成员变量
注意他们是保护类型的
- //移动状态
- 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;
接下来的角色控制类就继承自上面这个类,
在这个类中将通过模型创建角色的实体(entity),通过参数sm创建角色的节点(node),以及获取这个模型的动画集(AnimationStateSet)
以下这段代码将创建角色的实体,节点,以及获取角色的所有动画,所谓的动画集就是所有动画的集合
- 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(); //获取动画集
以下这段代码将获取角色的动画状态(ogre自带的模型sinbad动画还比较全),
- //获取动画状态
- 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");
接下来的代码主要都是逻辑部分,就是处理按键和鼠标移动的部分了
比如想要控制角色的奔跑;当按下 A键 时候就是设置RunTop和RunBase状态为启用, 当 A键 松开时就禁用RunTop和RunBase状态
禁用和启用动画状态可以通过setEnabled(
);函数来控制,接下来就只需要在Render()函数中调用addTime函数就可以了,这要就可以播放角色动画了
以下是完整代码的CSDN博客地址:
以下是截图
![](http://hiphotos.baidu.com/ae8506/pic/item/f27eed42ad4bd1132f669e8b5aafa40f49fb05cf.jpg)