基於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android 3D遊戲開發(高階篇)——Opengl ES遊戲引擎實現Android3D遊戲開發遊戲引擎
- 關於Laravel框架中Guard的底層實現Laravel框架
- 如何實現一個基於 DOM 的模板引擎
- 基於"堆"的底層實現和應用
- 9個基於Java的搜尋引擎框架Java框架
- Bevy:基於Rust的資料驅動遊戲引擎和應用程式框架Rust遊戲引擎框架
- Minya 分層框架實現的思考(一):依賴轉移框架
- EF架構~基於EF資料層的實現架構
- 基於 “typesys” 實現序列指令碼框架指令碼框架
- 基於Spring的流量拷貝框架實現Spring框架
- 【mybatis annotation】資料層框架應用--Mybatis(二) 基於註解實現資料的CRUDMyBatis框架
- 基於heartbeat的NFS HA實現(轉)NFS
- 基於heartbeat的NFS HA實現 (轉)NFS
- 基於MySql主從分離的程式碼層實現MySql
- Camunda 流程引擎的一種 Adapter 層實現APT
- 轉自OGRE的一些遊戲程式設計的連結遊戲程式設計
- Android 3D遊戲開發——Opengl ES遊戲引擎實現Android3D遊戲開發遊戲引擎
- 基於DRBD實現資料庫高可用資料庫
- 基於yolov5實現的AI智慧盒子框架YOLOAI框架
- 所得與所見:[-View周邊-] 框架層View框架
- 基於Gin框架實現異常處理框架
- 基於HT for Web向量實現3D葉輪旋轉Web3D
- 基於 Web 引擎擴充套件技術的 RTC 混合開發框架實踐Web套件框架
- JAVA Socket 底層是怎樣基於TCP/IP實現的???JavaTCP
- 基於XML的購物車的實現(轉)XML
- 清新優雅&高顏值!一個基於Vue3實現的後臺管理模板Vue
- 【mybatis xml】資料層框架應用--Mybatis 基於XML對映檔案實現資料的CRUDMyBatisXML框架
- 基於HT for Web的3D樹的實現Web3D
- 基於滴滴雲部署 HAProxy 實現 7 層和 4 層負載均衡負載
- 基於 Mysql 實現一個簡易版搜尋引擎MySql
- 關於三層架構中各層次的關係與實現模型 (轉)架構模型
- 基於ES5`defineProperty` 實現簡單的 Mvvm框架MVVM框架
- 基於Decorator的React高階元件的思路分析與實現React元件
- 基於Netty自己動手實現Web框架NettyWeb框架
- 【java規則引擎】一個基於drools規則引擎實現的數學計算例子Java
- 基於Unity3D引擎的大地形生成研究Unity3D
- IT轉型與基於雲的架構實現架構
- 關於基於JiveJdon3框架的POJOObjectFactory問題框架POJOObject