Где в структуре Ogre3D я должен добавлять / удалять динамические объекты? - PullRequest
0 голосов
/ 11 января 2012

Я хочу динамически загружать и отпускать объекты в зависимости от местоположения или времени, не заставляя игрока ждать.

Эта небольшая демонстрация начинается с одной модели 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,Должен быть более элегантный способ предоставления объектов приложения слушателю фрейма, но это хороший вопрос для другого дня.

ВОПРОСЫ:

  1. Является ли frameEnded () хорошим местом для добавления динамических дополнений в сцену?Что было бы лучше?

  2. Как удалить динамически создаваемые сетку, сущность и узел?

  3. Какие функции Ogre безопасны для вставкиотдельная тема?Ручной объект / позиция / textureCoord / convertToMesh?А как насчет createEntity / createSceneNode?

1 Ответ

0 голосов
/ 18 января 2012

Ответ на 1): используйте менеджер сцены, у него есть методы для уничтожения сущностей и узлов.

2) Я не знаю, gutfeeling: ни один из них.

ВВообще для таких вещей, как изменения сцены, я бы посоветовал против слушателя фрейма, а лучше реализовать свой собственный цикл рендеринга, используя Root-> renderOneFrame () (может быть, что-то похожее, не знаю точное имя из головы)

...