2012-01-11 39 views
0

我想根據位置或時間動態加載和釋放對象,而不會讓玩家等待。在Ogre3D框架中,我應該添加/刪除動態對象嗎?

這個小小的演示從草坪上的一個辛巴達模型開始,經過500幀後,切換到海灘石塊的平面並添加一個辛巴達。

ExampleApplication.h開始,我把動態代碼在frameEnded()功能:

 
     bool frameEnded(const FrameEvent& evt) { 
      gpf->frameNUM++; //gpf is pointer to object class gstate 
      if (gpf->loadSTATE==0) 
       if (gpf->frameNUM>500) { 
        gpf->loadSTATE=1; 
        gpf->ent1->setMaterialName("Examples/BeachStones"); 
        gpf->ent2=msm->createEntity("MyEntity2","sinbad.mesh"); //msm is mSceneMgr 
        gpf->node2=msm->createSceneNode("Node2"); 
        msm->getRootSceneNode()->addChild(gpf->node2); 
        gpf->node2->setPosition(10,0,0); 
        gpf->node2->attachObject(gpf->ent2); 
        } 
      updateStats(); 
      return true; 
      }  

整個main.cpp

<pre> 
#include "Ogre.h" 
class gstate { 
    public: 
    gstate() { loadSTATE=0; frameNUM=0; ent1=NULL; ent2=NULL; node2=NULL; } 
    Ogre::Entity *ent1, *ent2; 
    Ogre::SceneNode *node2; 
    int loadSTATE,frameNUM; 
}; 
#include "ExampleApplication.h" 
class Test4 : public ExampleApplication { 
    public: 
     void createScene() { 
      gp=new gstate(); 
      Ogre::Plane plane(Vector3::UNIT_Y, -10); 
       Ogre::MeshManager::getSingleton().createPlane("plane", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,plane,1500,1500,200,200,true,1,5,5,Vector3::UNIT_Z); 
      gp->ent1=mSceneMgr->createEntity("GrassPlane","plane"); 
      mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(gp->ent1); 
      gp->ent1->setMaterialName("Examples/GrassFloor"); 
      Ogre::Entity *ent=mSceneMgr->createEntity("MyEntity","sinbad.mesh"); 
      mSceneMgr->getRootSceneNode()->attachObject(ent); 
     } 
    }; 
Test4 app; 
int main(void) { 
    app.go(); 
    return 0; 
    } 

ExampleApp.hExampleFrameListener.h其餘除了允許ExampleAp進行更改外沒有任何變化p通過gstate類與Frame Listener共享數據。必須有一種更優雅的方式將應用程序對象公開給框架監聽器,但這對另一天來說是個好問題。

問題:

  1. frameEnded()的好地方,把動態增加的情景嗎?什麼會更好?

  2. 如何刪除動態創建的網格,實體和節點?

  3. 什麼食人魔功能可以安全地放在一個單獨的線程?手動對象/位置/ textureCoord/convertToMesh?那麼createEntity/createSceneNode呢?

回答

0

回答1):使用場景管理器,它有方法來銷燬實體和節點。

2)我不知道,gutfeeling是:這些都不是。

一般來說,對於像場景改變這樣的東西,我會建議不要使用框架監聽器,而是使用Root-> renderOneFrame()來實現您自己的渲染循環(也許類似的,不知道從頭頂的確切名稱)