Historique des modifications - Message

Message #11289

Sujet: Problème de déplacement et de collision


Type Date Auteur Contenu
Création du message 25-05-2013 17:30:22 johnplayer
Il y a quelque trucs qui me dérange dans ton code et qui serait potentiellement problématique.
1/ Ton "selector->drop();" dans le constructeur de classe est à l'extérieur de ta boucle. Il devrait être juste après "metaSelector->addTriangleSelector(selector);".
2/ Dans ta boucle de rendu, tu créé des variables et c'est pas top (allocation et désallocation de la mémoire à chaque frame).
3/ Tu mets ton temps en secondes pour le re-multiplier lors du calcul de déplacement, c'est pas optimal.

En gros, je ferais ça :

Code c++ :


Monstres::Monstres(irr::scene::ISceneManager *sceneManager, irr::video::IVideoDriver *driver, irr::scene::IMetaTriangleSelector* metaSelectorTerrain)
{
    selector = 0;
    scene::IMetaTriangleSelector* metaSelector = sceneManager->createMetaTriangleSelector();

    int i=0,j=0;

    for (i=0; i<Nombre_Monstres; i++)
    {
        for (j=0; j<Nombre_Monstres; j++)
        {
            m_Monstres[i][j] = sceneManager->addAnimatedMeshSceneNode(sceneManager->getMesh ("Ressources/Mesh/Monstres.obj"),0,ID_IsMonster);
            m_Monstres[i][j]->setScale(core::vector3df(0.25f));
            m_Monstres[i][j]->setPosition(irr::core::vector3df(6-Taille_Terrain,0,0));
           
            selector = sceneManager->createTriangleSelector(m_Monstres[i][j]);
            m_Monstres[i][j]->setTriangleSelector(selector);
            metaSelector->addTriangleSelector(selector);
            selector->drop(); ///////////////////////////////////////  drop pour chaque selector créé

            scene::ISceneNodeAnimator* collision_Monstres = sceneManager->createCollisionResponseAnimator(metaSelector, m_Monstres[i][j], core::vector3df(0.25,0.25,0.25), core::vector3df(0,0,0));
            scene::ISceneNodeAnimator* collision_Terrain = sceneManager->createCollisionResponseAnimator(metaSelectorTerrain, m_Monstres[i][j], core::vector3df(0.25,0.25,0.25), core::vector3df(0,0,0));

            if(collision_Monstres && collision_Terrain)
            {
                m_Monstres[i][j]->addAnimator(collision_Monstres);
                collision_Monstres->drop();

                m_Monstres[i][j]->addAnimator(collision_Terrain);
                collision_Terrain->drop();
            }
        }
    }
}




void Monstres::Deplacement(irr::scene::ISceneManager *sceneManager, Terrain plateau_de_jeu,  double frameDeltaTime)
{
    int i=0,j=0;
    core::vector3df position_monstre, postition2;
    postition2 = m_Monstres[i][j]->getPosition();

    for (i=0; i<Nombre_Monstres; i++)
    {
        for (j=0; j<Nombre_Monstres; j++)
        {
            if(m_Monstres[i][j] != 0)
            {
                position_monstre = m_Monstres[i][j]->getPosition();

                position_monstre.X += 0.001f * frameDeltaTime; //////////////////////////////// coefficient modifié

                m_Monstres[i][j]->setPosition(position_monstre);
            }
        }
    }
}

// boucle de rendu

s32 fps=0; ///////////////////////////  variables à l'extérieur de la boucle
u32 now=0;
f32 frameDeltaTime=0.f;

while (device->run() && driver)
    {                         
        // Calcul le temps delta d'une image.
        now = device->getTimer()->getTime();
        frameDeltaTime = now - then; // Temps en secondes
        then = now;

        driver->beginScene(true, true, irr::video::SColor(255,255,255,255)); // demarre le rendu // clear back-buffer  // clear z-buffer // fond blanc
       
        Entity_Monstres.Deplacement(sceneManager,plateau_de_jeu, frameDeltaTime);

        sceneManager->drawAll();                    // calcule le rendu
        driver->endScene();                         // affiche le rendu
       
        fps = driver->getFPS();

        if (lastFPS != fps)
        {
            core::stringw tmp(L"Ressources/Mesh/Monstres.obj");
            tmp += driver->getName();
            tmp += L"Movement Example - Irrlicht Engine [";
            tmp += fps;

            device->setWindowCaption(tmp.c_str());
            lastFPS = fps;
        }
       
    }



Je ne sais pas si ça changera quelque chose, le frameDeltaTime était peut-être tronqué. Moi j'aurais fait "f32(now - then)/1000.f" parce qu'il me semble que faire (f32)(now - then) fait une réinterprétation et non pas une conversion.
Si je ne me trompe pas "(f32)(now - then)", c'est comme faire "reinterpret_cast<f32>(now - then);". Ce qui fait qu'il te renvoyait un zéro au lieu de la valeur attendue.

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
107 invités en ligne
membre en ligne: -
RSS Feed