Skip to main content

History: IntermediateTutorial1Source

Source of version: 2

Copy to clipboard
            This is the source code for ((Intermediate Tutorial 1)).

{CODE(wrap="1",colors="c++")}#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)
     {
 
         // Set default values for variables
         mWalkSpeed = 35.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;
 
         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;
         if ((1.0f + src.dotProduct(mDirection)) < 0.0001f) 
         {
             mNode->yaw(Degree(180));
         }
         else
         {
             Ogre::Quaternion quat = src.getRotationTo(mDirection);
             mNode->rotate(quat);
         } // else
 
         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);
                 } 
                 else
                 {
                     // Rotation Code will go here later
                 }
             }
 
             else
             {
                 mNode->translate(mDirection * move);
             } // else
         } // if
 
         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 the 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.1f, 0.1f, 0.1f);
 
         ent = mSceneMgr->createEntity("Knot3", "knot.mesh");
         node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot3Node",
             Vector3(-100.0f, -10.0f,-200.0f));
         node->attachObject(ent);
         node->setScale(0.1f, 0.1f, 0.1f);
 
         // Set the camera to look at our handiwork
         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);
     }
 
 };
 
 
 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
 #define WIN32_LEAN_AND_MEAN
 #include "windows.h"
 
 
 INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
 #else
 int main(int argc, char **argv)
 #endif
 {
     // Create application object
     MoveDemoApplication app;
 
     try {
         app.go();
     } catch(Exception& e){
 #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
         MessageBoxA(NULL, e.getFullDescription().c_str(), "An exception has occurred!",
             MB_OK | MB_ICONERROR | MB_TASKMODAL);
 #else
         fprintf(stderr, "An exception has occurred: %s\n",
             e.getFullDescription().c_str());
 #endif
     }
 
 
     return 0;
 }{CODE}
        

History

Information Version
Sun 17 of Feb, 2013 04:14 GMT-0000 holocronweaver Update file and class naming to conform with other tutorials 8
Mon 20 of Sep, 2010 16:04 GMT-0000 jacmoe 7
Fri 20 of Aug, 2010 10:46 GMT-0000 atomr 6
Fri 20 of Aug, 2010 10:40 GMT-0000 atomr 5
Wed 16 of Jun, 2010 13:59 GMT-0000 pera code fixed :) 4
Mon 04 of Jan, 2010 05:24 GMT-0000 jacmoe 3
Sun 06 of Dec, 2009 08:25 GMT-0000 jacmoe 2
Wed 15 of Oct, 2008 19:01 GMT-0000 OgreWikiBot Robot: Cosmetic changes 1