Ogre Intermediate Tutorial 1 改進版

 

///以下是main.cpp

#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 has_next()
    {
        if (mWalkList.empty())
            return false;
        return true;
    } // nextLocation()
    bool my_rotate()
    {
        mDestination = mWalkList.front();
        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;
    }
    bool frameStarted(const FrameEvent &evt)
    {
        if (has_next())
        {
            my_rotate();
            Real move = mWalkSpeed * evt.timeSinceLastFrame;
            mDistance -= move;
            mNode->translate(mDirection * move);
            if(mDistance <= 0.0f)
            {
                mNode->setPosition(mDestination);
                my_rotate();
                mWalkList.pop_front();
            }
            else
            {
                mAnimationState = mEntity->getAnimationState("Walk");
                mAnimationState->setLoop(true);
                mAnimationState->setEnabled(true);
            }
        }
        else
        {
            mAnimationState = mEntity->getAnimationState("Idle");
            mAnimationState->setLoop(true);
            mAnimationState->setEnabled(true);
        }
        mAnimationState->addTime(evt.timeSinceLastFrame);

        static String mytxt = "mDistance: ";
        OverlayElement* guiinfo = OverlayManager::getSingleton().getOverlayElement("Core/myinfo1");
        guiinfo->setCaption(mytxt + StringConverter::toString(mDistance));

        static String mytxt2 = "mDestination: ";
        OverlayElement* guiinfo2 = OverlayManager::getSingleton().getOverlayElement("Core/myinfo2");
        guiinfo2->setCaption(mytxt2 + StringConverter::toString(mDestination));

        static String mytxt3 = "mDirection: ";
        OverlayElement* guiinfo3 = OverlayManager::getSingleton().getOverlayElement("Core/myinfo3");
        guiinfo3->setCaption(mytxt3 + StringConverter::toString(mDirection));

        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(150.0f, 0.0f, 120.0f));
        mWalkList.push_back(Vector3(250.0f, 0.0f, 50.0f));
        mWalkList.push_back(Vector3(150.0f, 0.0f, -100.0f));

        // Create objects so we can see movement
        Entity *ent;
        SceneNode *node;

        ent = mSceneMgr->createEntity("Knot0", "knot.mesh");
        node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot0Node",
            Vector3(0.0f, -10.0f, 25.0f));
        node->attachObject(ent);
        node->setScale(0.1f, 0.1f, 0.1f);

        ent = mSceneMgr->createEntity("Knot1", "knot.mesh");
        node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot1Node",
            Vector3(150.0f, -10.0f, 120.0f));
        node->attachObject(ent);
        node->setScale(0.1f, 0.1f, 0.1f);

        ent = mSceneMgr->createEntity("Knot2", "knot.mesh");
        node = mSceneMgr->getRootSceneNode()->createChildSceneNode("Knot2Node",
            Vector3(250.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(150.0f, -10.0f,-100.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;
}
///E:/ogre/media/packs/OgreCore.zip/OgreDebugPanel.overlay 在這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章