Eleventh Demo of OGRE
2010-07-09 11:47
435 查看
#include "ExampleApplication.h" #include <deque> using namespace std; class MoveDemoListener : public ExampleFrameListener { public: MoveDemoListener(RenderWindow* win, Camera* cam, SceneNode *sn, Entity *ent, deque<Vector3> &walk) : ExampleFrameListener(win, cam, false, false), mNode(sn), mEntity(ent), mWalkList( walk ) { //first animation /* mAnimationState = ent->getAnimationState("Idle"); mAnimationState->setLoop(true); mAnimationState->setEnabled(true); */ mWalkSpeed = 85.0f; mDirection = Vector3::ZERO; } // MoveDemoListener /* This function is called to start the object moving to the next position in mWalkList. */ bool nextLocation( ) { if (mWalkList.empty()) { return false; } return true; } // nextLocation( ) bool frameStarted(const FrameEvent &evt) { if (mDirection == Vector3::ZERO) { if (nextLocation()) { // Set walking animation mAnimationState = mEntity->getAnimationState("Walk"); mAnimationState->setLoop(true); mAnimationState->setEnabled(true); } } else { Real move = mWalkSpeed * evt.timeSinceLastFrame; mDistance -= move; if (mDistance <= 0.0f) { mNode->setPosition(mDestination); mDirection = Vector3::ZERO; // Set animation based on if the robot has another point to walk to. if (! nextLocation()) { // Set Idle animation mAnimationState = mEntity->getAnimationState("Idle"); mAnimationState->setLoop(true); mAnimationState->setEnabled(true); mDirection += 0.5f; mDestination += 100.0f; mWalkList.push_back(mDestination); ::Sleep(1000); mAnimationState = mEntity->getAnimationState("Walk"); } else { // Rotation Code will go here later //... } } else { mNode->translate(mDirection * move); } // else } // if mDestination = mWalkList.front(); // this gets the front of the deque mWalkList.pop_front(); // this removes the front of the deque mDirection = mDestination - mNode->getPosition(); mDistance = mDirection.normalise(); Vector3 src = mNode->getOrientation() * Vector3::UNIT_X; Ogre::Quaternion quat = src.getRotationTo(mDirection); mNode->rotate(quat); src = mNode->getOrientation() * Vector3::UNIT_X; if ((1.0f + src.dotProduct(mDirection)) < 0.0001f) { mNode->yaw(Degree(180)); } else { Ogre::Quaternion quat = src.getRotationTo(mDirection); mNode->rotate(quat); } // else mAnimationState->addTime(evt.timeSinceLastFrame); return ExampleFrameListener::frameStarted(evt); } protected: Real mDistance; // The distance the object has left to travel Vector3 mDirection; // The direction the object is moving Vector3 mDestination; // The destination the object is moving towards AnimationState *mAnimationState; // The current animation state of the object Entity *mEntity; // The Entity we are animating SceneNode *mNode; // The SceneNode that the Entity is attached to std::deque<Vector3> mWalkList; // The list of points we are walking to Real mWalkSpeed; // The speed at which the object is moving }; class MoveDemoApplication : public ExampleApplication { protected: public: MoveDemoApplication() { } ~MoveDemoApplication() { } protected: Entity *mEntity; // The entity of the object we are animating SceneNode *mNode; // The SceneNode of the object we are moving std::deque<Vector3> mWalkList; // A deque containing the waypoints void createScene(void) { // Set the default lighting. mSceneMgr->setAmbientLight(ColourValue(1.0f,1.0f,1.0f)); // Create the entity mEntity = mSceneMgr->createEntity("Robot","Robot.mesh"); //create a scene node mNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("RobotNode",Vector3(0.0f,0.0f,25.0f)); mNode->attachObject(mEntity); // Create the walking list mWalkList.push_back( Vector3( 550.0f, 0.0f, 50.0f ) ); mWalkList.push_back( Vector3(-100.0f, 0.0f, -200.0f ) ); // Create objects so we can see movement Entity *ent; SceneNode *node; ent = mSceneMgr->createEntity( "Knot1", "knot.mesh" ); node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot1Node", Vector3( 0.0f, -10.0f, 25.0f ) ); node->attachObject( ent ); node->setScale( 0.1f, 0.1f, 0.1f ); ent = mSceneMgr->createEntity( "Knot2", "knot.mesh" ); node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot2Node",Vector3( 550.0f, -10.0f, 50.0f ) ); node->attachObject( ent ); node->setScale( 0.3f, 0.3f, 0.3f ); ent = mSceneMgr->createEntity( "Knot3", "knot.mesh" ); node = mSceneMgr->getRootSceneNode( )->createChildSceneNode( "Knot3Node",Vector3(-100.0f, -10.0f,-200.0f ) ); node->attachObject( ent ); node->setScale( 0.5f, 0.5f, 0.5f ); // Set the camera to look at our handywork mCamera->setPosition(90.0f, 280.0f, 535.0f); mCamera->pitch(Degree(-30.0f)); mCamera->yaw(Degree(-15.0f)); } void createFrameListener(void) { mFrameListener= new MoveDemoListener(mWindow, mCamera, mNode, mEntity, mWalkList); mFrameListener->showDebugOverlay(true); mRoot->addFrameListener(mFrameListener); } }; INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT ) { // Create application object MoveDemoApplication app; try { app.go(); } catch( Ogre::Exception& e ) { MessageBox( NULL, e.getFullDescription().c_str(), "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL); } return 0; }
相关文章推荐
- Third Demo of OGRE
- Eighth Demo of OGRE
- Twelfth Demo of OGRE
- Thirteenth Demo of OGRE
- Second Demo of OGRE
- Fifteenth Demo of OGRE
- First Demo of OGRE
- Fourth Demo of OGRE
- Fifth Demo of OGRE---Listener
- Sixth Demo of OGRE---Buffer Input
- Seventh Demo of OGRE
- Lerning Entity Framework 6 ------ A demo of using Entity framework with MySql
- OGRE例子:Demo_Ocean 源码解析
- Havok动画渲染Demo(使用Ogre)
- Ogre水波演示Demo(注释)
- Demo of Microsoft Chart Controls for Microsoft .NET Framework 3.5
- 编译运行ogre程序时“error C3859: virtual memory range for PCH exceeded; please recompile with a command line option of '-Zm120' or great
- A demo of nonprefix & prefix index
- Ogre出现”…The minimum corner of the box must be less than or equal to maximum corner”错误
- Demo of DataPager