Я хочу динамически загружать и отпускать объекты в зависимости от местоположения или времени, не заставляя игрока ждать.
Эта небольшая демонстрация начинается с одной модели Sinbad на плоскости травы, а через 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
не затрагиваются, за исключением изменений, позволяющих ExampleApp обмениваться данными с прослушивателем кадров через класс gstate,Должен быть более элегантный способ предоставления объектов приложения слушателю фрейма, но это хороший вопрос для другого дня.
ВОПРОСЫ:
Является ли frameEnded () хорошим местом для добавления динамических дополнений в сцену?Что было бы лучше?
Как удалить динамически создаваемые сетку, сущность и узел?
Какие функции Ogre безопасны для вставкиотдельная тема?Ручной объект / позиция / textureCoord / convertToMesh?А как насчет createEntity / createSceneNode?