Historique des modifications - Message

Message #11289

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


TypeDateAuteurContenu
Création du message25-05-2013 17:30:22johnplayer
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

OptionsLiens officielsCaractéristiquesStatistiquesCommunauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1441 sujets
11339 messages
Dernier membre inscrit: Saidov17
31 invités en ligne
membre en ligne: -
RSS Feed