Our model can move but it isn't animated yet, let's change this.
FrameListener
needs two animation states:Ogre::AnimationState* _aniState; Ogre::AnimationState* _aniStateTop;
MyFrameListener(Ogre::RenderWindow* win,Ogre::Camera* cam,Ogre::Viewport* viewport,Ogre::SceneNode* node,Ogre::Entity* ent)
AnimationState
and save them for later use:_aniState = ent->getAnimationState("RunBase"); _aniState->setLoop(false); _aniStateTop = ent->getAnimationState(«RunTop»); _aniStateTop->setLoop(false);
AnimationState
, we need to have a flag in the frameStarted
function, which tells us whether or not the entity walked this frame. We add this flag into the if
conditions that query the keyboard state:bool walked = false; if(_Keyboard->isKeyDown(OIS::KC_UP)) { SinbadTranslate += Ogre::Vector3(0,0,-1); _rotation = 3.14f; walked = true; } if(_Keyboard->isKeyDown(OIS::KC_DOWN)) { SinbadTranslate += Ogre::Vector3(0,0,1); _rotation = 0.0f; walked = true; } if(_Keyboard->isKeyDown(OIS::KC_LEFT)) { SinbadTranslate += Ogre::Vector3(-1,0,0); _rotation = -1.57f; walked = true; } if(_Keyboard->isKeyDown(OIS::KC_RIGHT)) { SinbadTranslate += Ogre::Vector3(1,0,0); _rotation = 1.57f; walked = true; }
if(walked) { _aniState->setEnabled(true); _aniStateTop->setEnabled(true); if(_aniState->hasEnded()) { _aniState->setTimePosition(0.0f); } if(_aniStateTop->hasEnded()) { _aniStateTop->setTimePosition(0.0f); } }
else { _aniState->setTimePosition(0.0f); _aniState->setEnabled(false); _aniStateTop->setTimePosition(0.0f); _aniStateTop->setEnabled(false); }
_aniState->addTime(evt.timeSinceLastFrame); _aniStateTop->addTime(evt.timeSinceLastFrame);
Ogre::Entity* _SinbadEnt;
FrameListener:
_listener = new MyFrameListener(window,camera,viewport,_SinbadNode,_SinbadEnt);
_SinbadEnt = _sceneManager->createEntity("Sinbad.mesh");
3.147.8.91