我想根據位置或時間動態加載和釋放對象,而不會讓玩家等待。在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.h
和ExampleFrameListener.h
其餘除了允許ExampleAp進行更改外沒有任何變化p通過gstate類與Frame Listener共享數據。必須有一種更優雅的方式將應用程序對象公開給框架監聽器,但這對另一天來說是個好問題。
問題:
是frameEnded()的好地方,把動態增加的情景嗎?什麼會更好?
如何刪除動態創建的網格,實體和節點?
什麼食人魔功能可以安全地放在一個單獨的線程?手動對象/位置/ textureCoord/convertToMesh?那麼createEntity/createSceneNode呢?