0

プレイヤーを待たせることなく、場所や時間に基づいてオブジェクトを動的にロードおよびリリースしたいと考えています。

この小さなデモでは、1 つのシンドバッド モデルを草むらに乗せて開始し、500 フレーム後、ビーチ ストーンのプレーンに切り替えて、もう 1 つのシンドバッドを追加します。

から始めてExampleApplication.h、動的コードをframeEnded()関数に入れました。

        bool frameEnded(const FrameEvent& evt) {
            gpf->frameNUM++; //gpf はオブジェクト クラス gstate へのポインタです
            もし (gpf->loadSTATE==0)
                if (gpf->frameNUM>500) {
                    gpf->loadSTATE=1;
                    gpf->ent1->setMaterialName("Examples/BeachStones");
                    gpf->ent2=msm->createEntity("MyEntity2","sinbad.mesh"); //msm は mSceneMgr です
                    gpf->node2=msm->createSceneNode("Node2");
                    msm->getRootSceneNode()->addChild(gpf->node2);
                    gpf->node2->setPosition(10,0,0);
                    gpf->node2->attachObject(gpf->ent2);
                    }
            updateStats();
            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;
    }

gstate クラスを介して ExampleApp がフレーム リスナーとデータを共有できるようにするための変更を除いて、ExampleApp.hとの残りの部分は変更されていません。ExampleFrameListener.hアプリケーション オブジェクトをフレーム リスナーに公開するためのより洗練された方法があるはずですが、それはまた別の機会にします。

質問:

  1. frameEnded ()は、動的な追加をシーンに配置するのに適した場所ですか? 何が良いでしょうか?

  2. 動的に作成されたメッシュ、エンティティ、およびノー​​ドを削除するには?

  3. 別のスレッドに入れても安全な Ogre 関数は何ですか? マニュアル オブジェクト / 位置 / textureCoord / convertToMesh? createEntity / createSceneNode はどうですか?

4

1 に答える 1

0

1) への回答: シーン マネージャーを使用します。エンティティとノードを破棄するメソッドがあります。

2) わかりません。直感とは: これらのどれでもない.

一般的に、シーンの変更のようなものについては、フレーム リスナーを使用しないことをお勧めしますが、Root->renderOneFrame() を使用して独自のレンダリング ループを実装することをお勧めします (似たようなものかもしれませんが、頭のてっぺんからの正確な名前はわかりません)。

于 2012-01-18T17:54:48.153 に答える