Historique des modifications - Message

Message #11287

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


Type Date Auteur Contenu
Création du message 25-05-2013 07:15:33 Super-Vlan
Bonjour.

Je me suis mis, il y a quelques jours, à programmer un petit jeu avec irrlicht. Je me trouve cependant actuellement face à un problème!

Je souhaite déplacer automatiquement plusieurs cubes dans une sorte de labyrinthe (chemin aléatoire unique).

J'ai donc envisagé deux solutions (amenant à deux problèmes différents) pour déplacer mes cubes :

  • -Leurs faire suivre un chemin à l'aide d'un followspline (que je privilégie car plus simple),
  • -Les faire ce déplacer jusqu'à un mur puis les faire tourner.


La première solution fonctionne pour le déplacement, les cubes suivent correctement le chemin. Cependant, ils sont tous "confondus". J'ai alors ajouté un système de collision entre les cubes mais ceux-ci continuent à ce chevaucher. J'ai comme l'impression que le followspline "annule" le système de collision. Auriez vous une idée pour résoudre ce problème? (je n'utilise pas de moteur physique externe).

Ma deuxième solution ne fonctionne tous simplement pas! Pour faire un test simple, j'ai demandé au programme de déplacer mon cube de 1.0 sur l'axe des x à chaque frame sans autres conditions particulière. Et là, il ne se déplace que lors de la première frame et ne bouge plus ensuite...

Voici donc ma classe "Monstre" :

Code c++ :



class Monstres
{
public:
	Monstres(irr::scene::ISceneManager *sceneManager, irr::video::IVideoDriver *driver, irr::scene::IMetaTriangleSelector* metaSelectorTerrain);
	void Deplacement(irr::scene::ISceneManager *sceneManager, Terrain plateau_de_jeu, double frameDeltaTime);
	Monstres();

private:
	
	irr::scene::IAnimatedMeshSceneNode* m_Monstres[Nombre_Monstres][Nombre_Monstres];
	irr::scene::ITriangleSelector* selector;
	irr::scene::IMetaTriangleSelector* metaSelector;
	std::string Nom_Monstres;
};

 


Le constructeur et la fonction de déplacement :

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);

			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();
			}
		}
	}

	selector->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 += 1.0f * frameDeltaTime;

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

}

 


et l'appel de la fonction déplacement dans le main :

Code c++ :



while (device->run() && driver) 
	{                         
		// Calcul le temps delta d'une image.
        const u32 now = device->getTimer()->getTime();
        const f32 frameDeltaTime = (f32)(now - then) / 1000.f; // 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
		
        int fps = driver->getFPS();
 
        if (lastFPS != fps)
        {
            core::stringw tmp(L"Movement Example - Irrlicht Engine [");
            tmp += driver->getName();
            tmp += L"] fps: ";
            tmp += fps;
 
            device->setWindowCaption(tmp.c_str());
            lastFPS = fps;
        }
		
    }

 


Par exemple, il commence à (-44,0,0), vas arriver en (-43,0,0) et ne plus bouger alors que la fonction est bien appeler et que normalement la position du cube est mise à jour...

Je ne comprends pas pourquoi mon cube ne bouge pas! Mon problème vient-il du constructeur de ma classe (appelé plus tôt dans le programme, avant la boucle de rendu) ou de ma fonction de déplacement?

J'espère que vous pourrez m'aider!

Bonne prog!

Super-Vlan

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
148 invités en ligne
membre en ligne: -
RSS Feed