现在的位置: 首页 > 综合 > 正文

第五章 OGRE中的动画及打印出所有动作的名字

2013年10月08日 ⁄ 综合 ⁄ 共 6394字 ⁄ 字号 评论关闭
#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;
}

抱歉!评论已关闭.