ITPub博客

首页 > 应用开发 > IT综合 > 基于OGRE所实现的高层游戏引擎框架(3)(转)

基于OGRE所实现的高层游戏引擎框架(3)(转)

原创 IT综合 作者:post0 时间:2007-08-12 20:10:53 0 删除 编辑
基于OGRE所实现的高层游戏引擎框架(3)(转)[@more@]

  附录

  Terrain Example

  /*

  

  This source file is part of OGRE

  

    (Object-oriented Graphics Rendering Engine)

  

  For the latest info, see http://www.ogre3d.org/

  

  Copyright ?2000-2003 The OGRE Team

  

  Also see acknowledgements in Readme.html

  

  You may use this sample code for anything you like, it is not covered by the

  

  LGPL like the rest of the engine.

  

  */

  

  

  

  /**

  

    file

  

      Terrain.h

  

    rief

  

      Specialisation of OGRE's framework application to show the

  

      terrain rendering plugin

  

  */

  

  #include "ExampleApplication.h"

  

  #include "OgreStringConverter.h"

  

  #define FLOW_SPEED 0.2

  

  #define FLOW_HEIGHT 0.8

  

  class TerrainListener : public ExampleFrameListener

  

  {

  

   public:

  

    TerrainListener(RenderWindow* win, Camera* cam) :ExampleFrameListener(win, cam) { };

  

  // Override frameStarted event to process that (don't care about frameEnded)

  

    bool frameStarted(const FrameEvent& evt)

  

    {

  

      float moveScale;

  

      float rotScale;

  

      float waterFlow;

  

      static float flowAmount = 0.0f;

  

      static bool flowUp = true;

  

      // local just to stop toggles flipping too fast

  

      static Real timeUntilNextToggle = 0;

  

      if (timeUntilNextToggle >= 0)

  

        timeUntilNextToggle -= evt.timeSinceLastFrame;

  

      // If this is the first frame, pick a speed

  

      if (evt.timeSinceLastFrame == 0)

  

      {

  

        moveScale = 1;

  

        rotScale = 0.1;

  

        waterFlow = 0.0f;

  

      }

  

      // Otherwise scale movement units by time passed since last frame

  

      else

  

      {

  

        // Move about 100 units per second,

  

        moveScale = 10.0 * evt.timeSinceLastFrame;

  

        // Take about 10 seconds for full rotation

  

        rotScale = 36 * evt.timeSinceLastFrame;

  

        // set a nice waterflow rate

  

        waterFlow = FLOW_SPEED * evt.timeSinceLastFrame;

  

      }

  

      // Grab input device state

  

      mInputDevice->capture();

  

      SceneNode *waterNode = static_cast(

  

        mCamera->getSceneManager()->getRootSceneNode()->getChild("WaterNode"));

  

      if(waterNode)

  

      {

  

        if(flowUp)

  

          flowAmount += waterFlow;

  

        else

  

          flowAmount -= waterFlow;

  

  

  

        if(flowAmount >= FLOW_HEIGHT)

  

          flowUp = false;

  

        else if(flowAmount <= 0.0f)

  

          flowUp = true;

  

  

  

        waterNode->translate(0, (flowUp ? waterFlow : -waterFlow), 0);

  

      }

  

      static Vector3 vec;

  

      vec = Vector3::ZERO;

  

      if (mInputDevice->isKeyDown(KC_A))

  

      {

  

        // Move camera left

  

        vec.x = -moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_D))

  

      {

  

        // Move camera RIGHT

  

        vec.x = moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_UP) || mInputDevice->isKeyDown(KC_W))

  

      {

  

        // Move camera forward

  

        vec.z = -moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_DOWN) || mInputDevice->isKeyDown(KC_S))

  

      {

  

        // Move camera backward

  

        vec.z = moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_PGUP))

  

      {

  

        // Move camera up

  

        vec.y = moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_PGDOWN))

  

      {

  

        // Move camera down

  

        vec.y = -moveScale;

  

      }

  

      if (mInputDevice->isKeyDown(KC_RIGHT))

  

      {

  

        mCamera->yaw(-rotScale);

  

      }

  

      if (mInputDevice->isKeyDown(KC_LEFT))

  

      {

  

        mCamera->yaw(rotScale);

  

      }

  

      if( mInputDevice->isKeyDown( KC_ESCAPE) )

  

      {

  

        return false;

  

      }

  

      // Rotate view by mouse relative position

  

      float rotX, rotY;

  

      rotX = -mInputDevice->getMouseRelativeX() * 0.13;

  

      rotY = -mInputDevice->getMouseRelativeY() * 0.13;

  

      // Make all the changes to the camera

  

      // Note that YAW direction is around a fixed axis (freelook stylee) rather than a natural YAW (e.g. airplane)

  

      mCamera->yaw(rotX);

  

      mCamera->pitch(rotY);

  

      mCamera->moveRelative(vec);

  

      // Rotate scene node if required

  

      SceneNode* node = mCamera->getSceneManager()->getRootSceneNode();

  

      if (mInputDevice->isKeyDown(KC_O))

  

      {

  

        node->yaw(rotScale);

  

      }

  

      if (mInputDevice->isKeyDown(KC_P))

  

      {

  

        node->yaw(-rotScale);

  

      }

  

      if (mInputDevice->isKeyDown(KC_I))

  

      {

  

        node->pitch(rotScale);

  

      }

  

      if (mInputDevice->isKeyDown(KC_K))

  

      {

  

        node->pitch(-rotScale);

  

      }

  

      if (mInputDevice->isKeyDown(KC_F) && timeUntilNextToggle <= 0)

  

      {

  

        mStatsOn = !mStatsOn;

  

        //Root::getSingleton().showDebugOverlay(mStatsOn);

  

        showDebugOverlay(mStatsOn);

  

        timeUntilNextToggle = 1;

  

      }

  

      // Return true to continue rendering

  

      return true;

  

    }

  

  

  

  };

  class TerrainApplication : public ExampleApplication

  

  {

  

  public:

  

    TerrainApplication() {}

  

  protected:

  

    virtual void createFrameListener(void)

  

    {

  

      mFrameListener= new TerrainListener(mWindow, mCamera);

  

      mFrameListener->showDebugOverlay(true);

  

      mRoot->addFrameListener(mFrameListener);

  

    }

    virtual void chooseSceneManager(void)

  

    {

  

      // Get the SceneManager, in this case a generic one

  

      mSceneMgr = mRoot->getSceneManager( ST_EXTERIOR_CLOSE );

  

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/8225414/viewspace-951792/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    2018
  • 访问量
    8225847