基於OGRE所實現的高層遊戲引擎框架(3)(轉)
基於OGRE所實現的高層遊戲引擎框架(3)(轉)[@more@] 附錄 Terrain Example /* This source file is part of OGRE (Object-oriented Graphics Rendering Engine) For the latest info, see 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Bevy:基於Rust的資料驅動遊戲引擎和應用程式框架Rust遊戲引擎框架
- 關於Laravel框架中Guard的底層實現Laravel框架
- 分享一些基於Cocos2dx3.x引擎的遊戲專案和遊戲功能示例遊戲
- Minya 分層框架實現的思考(一):依賴轉移框架
- 基於"堆"的底層實現和應用
- 基於Spring的流量拷貝框架實現Spring框架
- VR虛擬現實遊戲所體現的亮點分析VR遊戲
- Camunda 流程引擎的一種 Adapter 層實現APT
- 基於 .NET 的開源工作流引擎框架框架
- 基於 “typesys” 實現序列指令碼框架指令碼框架
- 【mybatis annotation】資料層框架應用--Mybatis(二) 基於註解實現資料的CRUDMyBatis框架
- 基於MySql主從分離的程式碼層實現MySql
- 基於yolov5實現的AI智慧盒子框架YOLOAI框架
- 用 JavaScript 和 C3 實現一個轉盤小遊戲JavaScript遊戲
- 基於Redis實現線上遊戲積分排行榜Redis遊戲
- 基於Gin框架實現異常處理框架
- 基於Netty自己動手實現Web框架NettyWeb框架
- 基於 Web 引擎擴充套件技術的 RTC 混合開發框架實踐Web套件框架
- iOS基於中間層的路由跳轉方案iOS路由
- 【mybatis xml】資料層框架應用--Mybatis 基於XML對映檔案實現資料的CRUDMyBatisXML框架
- 基於eui的白鷺引擎H5小遊戲入門總結UIH5遊戲
- 基於ES5`defineProperty` 實現簡單的 Mvvm框架MVVM框架
- 基於滴滴雲部署 HAProxy 實現 7 層和 4 層負載均衡負載
- 基於 Mysql 實現一個簡易版搜尋引擎MySql
- 遊戲與遊戲引擎遊戲引擎
- JavaScript 遊戲開發:手把手實現碰撞物理引擎JavaScript遊戲開發
- 基於PyTorch框架的多層全連線神經網路實現MNIST手寫數字分類PyTorch框架神經網路
- 《權力的遊戲》3d地圖-基於Mapbox customlayer遊戲3D地圖TOML
- 火山引擎基於 Dragonfly 加速實踐Go
- 基於Unity3D引擎的大地形生成研究Unity3D
- 所得與所見:[-View周邊-] 框架層View框架
- 清新優雅&高顏值!一個基於Vue3實現的後臺管理模板Vue
- 基於ArkUI框架開發-ImageKnife渲染層重構UI框架
- 基於ArkUI框架開發——圖片模糊處理的實現UI框架
- .NET 下基於動態代理的 AOP 框架實現揭祕框架
- Unity 揹包系統的完整實現(基於MVC框架思想)UnityMVC框架
- 造個輪子之基於 Netty 實現自己的 RPC 框架NettyRPC框架
- Minya 分層框架實現的思考(三):問題框架
- 基於聲網互動白板實現一個多人數獨遊戲遊戲