#include "ExampleApplication.h" class Example25FrameListener:public Ogre::FrameListener { public: Example25FrameListener(Ogre::SceneNode* node,RenderWindow* win,Ogre::Camera* cam/*1 begin*/,Ogre::Entity* ent/*1 end*/): _node(node),_cam(cam),_PolygonMode(Ogre::PolygonMode::PM_SOLID)/*1 begin*/,_ent(ent)/*1 end*//*3 begin*/,_WalkingSpeed(50.0f),_rotation(0.0f)/*3 end*/ { size_t windowHnd=0; std::stringstream windowHndStr; win->getCustomAttribute("WINDOW",&windowHnd); windowHndStr<<windowHnd; OIS::ParamList pl; pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str())); _man=OIS::InputManager::createInputSystem(pl); _key=static_cast<OIS::Keyboard*>(_man->createInputObject(OIS::OISKeyboard,false)); _mouse=static_cast<OIS::Mouse*>(_man->createInputObject(OIS::OISMouse,false)); bRPressed=false; //1.1 begin //_aniState=_ent->getAnimationState("Dance"); //1.1 end //2_1|1.1 begin _aniState=_ent->getAnimationState("RunBase"); _aniStateTop=_ent->getAnimationState("RunTop"); //2_1|1.1 end } ~Example25FrameListener() { _man->destroyInputObject(_key); _man->destroyInputObject(_mouse); OIS::InputManager::destroyInputSystem(_man); } bool frameStarted(const Ogre::FrameEvent& evt) { bool walked = false; Ogre::Vector3 SinbadTranslate(0,0,0); _key->capture(); if(_key->isKeyDown(OIS::KC_ESCAPE)) return false; //3 begin if(_key->isKeyDown(OIS::KC_UP)) { SinbadTranslate+=Ogre::Vector3(0,0,-1); _rotation=3.14f; walked=true; } if(_key->isKeyDown(OIS::KC_DOWN)) { SinbadTranslate+=Ogre::Vector3(0,0,1); _rotation=0.0f; walked=true; } if(_key->isKeyDown(OIS::KC_LEFT)) { SinbadTranslate+=Ogre::Vector3(-1,0,0); _rotation=-1.57f; walked=true; } if(_key->isKeyDown(OIS::KC_RIGHT)) { SinbadTranslate+=Ogre::Vector3(1,0,0); _rotation=1.57f; walked=true; } //3 end Ogre::Vector3 translate=Ogre::Vector3(0,0,0); Real Speed=1; if(_key->isKeyDown(OIS::KC_LSHIFT)) { Speed=10; } if(_key->isKeyDown(OIS::KC_W)) { translate+=Ogre::Vector3(0,0,-10); } if(_key->isKeyDown(OIS::KC_S)) { translate+=Ogre::Vector3(0,0,10); } if(_key->isKeyDown(OIS::KC_A)) { translate+=Ogre::Vector3(-10,0,0); } if(_key->isKeyDown(OIS::KC_D)) { translate+=Ogre::Vector3(10,0,0); } if(_key->isKeyDown(OIS::KC_LCONTROL) && _key->isKeyDown(OIS::KC_C)) translate+=Ogre::Vector3(0,10,0); if(_key->isKeyDown(OIS::KC_R) && !bRPressed) { bRPressed=true; if(_PolygonMode==PM_SOLID) _PolygonMode=Ogre::PolygonMode::PM_WIREFRAME; else if(_PolygonMode==PM_WIREFRAME) _PolygonMode=Ogre::PolygonMode::PM_POINTS; else if(_PolygonMode==PM_POINTS) _PolygonMode=Ogre::PolygonMode::PM_SOLID; } if(bRPressed && !_key->isKeyDown(OIS::KC_R)) bRPressed=false; _mouse->capture(); float rotX=_mouse->getMouseState().X.rel*evt.timeSinceLastFrame*-1; float rotY=_mouse->getMouseState().Y.rel*evt.timeSinceLastFrame*-1; _cam->yaw(Ogre::Radian(rotX)); _cam->pitch(Ogre::Radian(rotY)); _cam->moveRelative(translate*evt.timeSinceLastFrame*Speed); _cam->setPolygonMode(_PolygonMode); //1 begin _aniState->addTime(evt.timeSinceLastFrame); //1.1 begin //_aniState->setEnabled(true);//After we got the animation state,we enabled it.This tell Ogre 3D to play this animation. //_aniState->setLoop(true);//Also,we set the loop property to true so the animation will be played again and again until we stop it. //1.1 end //3_2|1.1 begin _aniState->setLoop(false); //3_2|1.1 end //1 end //2_1 begin _aniStateTop->addTime(evt.timeSinceLastFrame); //2.1 begin //_aniStateTop->setEnabled(true); //_aniStateTop->setLoop(true); //2.1 end //3_2|2.1 begin _aniStateTop->setLoop(false); //3_2|2.1 end //2_1 end //3_2 begin 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); } _node->translate(SinbadTranslate*evt.timeSinceLastFrame*_WalkingSpeed); _node->resetOrientation(); _node->yaw(Ogre::Radian(_rotation)); //3_2 end return true; } private: Ogre::SceneNode* _node; OIS::InputManager* _man; OIS::Keyboard* _key; Ogre::Camera* _cam; OIS::Mouse* _mouse; Ogre::PolygonMode _PolygonMode; bool bRPressed; //1 begin Ogre::Entity* _ent; Ogre::AnimationState* _aniState; //1 end //2_1 begin Ogre::AnimationState* _aniStateTop; //2_1 end //3_2 begin float _WalkingSpeed; float _rotation; //3_2 end }; class Example1:public ExampleApplication { public: Example1() { FrameListener=NULL; } ~Example1() { if(FrameListener) { delete FrameListener; } } void createScene() { Ogre::Plane plane(Vector3::UNIT_Y,-10); Ogre::MeshManager::getSingleton().createPlane("planemesh",ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,200,200,true,1,5,5,Vector3::UNIT_Z); Ogre::Entity* LightPlane=mSceneMgr->createEntity("LightPlane","planemesh"); mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(LightPlane); LightPlane->setMaterialName("Examples/BeachStones"); Ogre::Light* DirectionalLight=mSceneMgr->createLight("MyDirectionalLight"); DirectionalLight->setType(Ogre::Light::LT_DIRECTIONAL); DirectionalLight->setDirection(Ogre::Vector3(1,-1,0)); Ogre::SceneNode* SubNodeRoot=mSceneMgr->getRootSceneNode()->createChildSceneNode("SubNodeRoot"); _SinbadEnt=mSceneMgr->createEntity("Sinbad","Sinbad.mesh"); _SinbadNode=SubNodeRoot->createChildSceneNode("SinbadNode"); _SinbadNode->setPosition(Ogre::Vector3(0.0f,4.0f,0.0f)); _SinbadNode->setScale(3.0f,3.0f,3.0f); _SinbadNode->attachObject(_SinbadEnt); mSceneMgr->setShadowTechnique(Ogre::SHADOWTYPE_STENCIL_ADDITIVE); //4_3 begin Ogre::Entity* sword1=mSceneMgr->createEntity("Sword1","Sword.mesh"); Ogre::Entity* sword2=mSceneMgr->createEntity("Sword2","Sword.mesh"); _SinbadEnt->attachObjectToBone("Handle.L",sword1); _SinbadEnt->attachObjectToBone("Handle.R",sword2); //4_3 end //5_4 begin Ogre::AnimationStateSet* set=_SinbadEnt->getAllAnimationStates(); Ogre::AnimationStateIterator iter=set->getAnimationStateIterator(); std::string stateStr; while(iter.hasMoreElements()) { stateStr+=iter.getNext()->getAnimationName(); stateStr+="\n"; } MessageBox(NULL,stateStr.c_str(),"All animations",0); //5_4 end } void createCamera() { mCamera=mSceneMgr->createCamera("MyCamera1"); mCamera->setPosition(Ogre::Vector3(0,100,200)); mCamera->lookAt(0,0,0); mCamera->setNearClipDistance(5); } void createFrameListener() { FrameListener=new Example25FrameListener(_SinbadNode,mWindow,mCamera,_SinbadEnt); mRoot->addFrameListener(FrameListener); } private: Ogre::SceneNode* _SinbadNode; Ogre::FrameListener* FrameListener; Ogre::Entity* _SinbadEnt; }; INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd) { Example1 app; app.go(); return 0; }