我想根据位置或时间动态加载和释放对象,而不会让玩家等待。
这个小型演示从草坪上的一个Sinbad模型开始,经过500帧后,切换到海滩石头平面并再增加一个Sinbad。
从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
的其余部分不受影响,但允许ExampleApp通过gstate类与Frame Listener共享数据的更改除外。必须有一种更优雅的方式将应用程序对象公开给帧监听器,但这对另一天来说是一个很好的问题。
问题:
frameEnded()是一个把动态添加到场景的好地方吗?什么会更好?
如何删除动态创建的网格,实体和节点?
什么Ogre函数可以放在一个单独的线程中?手动对象/位置/ textureCoord / convertToMesh?那么createEntity / createSceneNode呢?
答案 0 :(得分:0)
答案1):使用场景管理器,它有破坏实体和节点的方法。
2)我不知道,gutfeeling是:没有这些。
一般来说,对于像场景改变这样的东西,我建议不要使用框架监听器,而是使用Root-&gt; renderOneFrame()实现自己的渲染循环(也许类似的东西,不知道我头顶的确切名称)