博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于OGRE所实现的高层游戏引擎框架(3)(转)
阅读量:2449 次
发布时间:2019-05-10

本文共 5793 字,大约阅读时间需要 19 分钟。

基于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博客 ” ,链接:http://blog.itpub.net/8225414/viewspace-951792/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8225414/viewspace-951792/

你可能感兴趣的文章
gatsby_从零到部署:我如何使用Netlify + Gatsby从零开始创建静态网站
查看>>
哈希编码学习方法_想学习编码吗? 这很容易。 这是解决困难部分的方法。
查看>>
登录滑块验证表单_如何构建双滑块登录和注册表单
查看>>
javascript编写_如何编写JavaScript承诺
查看>>
哈佛 深度学习课程_通过哈佛的免费课程学习游戏开发
查看>>
计算机科学概论_计算机科学概论-哈佛大学的CS50
查看>>
c++ map用值寻找键_用.Map()寻找方法
查看>>
初学react实现路由跳转_学习React-初学者完整课程
查看>>
json套json_JSON速成课程
查看>>
前端开发人员_强大的前端开发人员
查看>>
入职开发很少写代码_如何简化开发人员入职:将开发环境作为代码
查看>>
python基础知识教程_通过此深入的视频课程学习Python基础知识
查看>>
maven开始spring_如何开始使用Maven
查看>>
unity第一人称射击游戏_建立自己的第一人称射击游戏:8小时Unity 3D GameDev教程
查看>>
何时在JavaScript中使用var vs let vs const
查看>>
chrome扩展程序_如何发布您的Chrome扩展程序
查看>>
java类生成json数据_如何用Java生成数据类
查看>>
python 2 不再维护_如何不再害怕Python
查看>>
适用于所有人的Nextjs-具有一些React的基础知识
查看>>
mac 释放空间_如何释放开发人员Mac上的空间
查看>>