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" :
Le constructeur et la fonction de déplacement :
et l'appel de la fonction déplacement dans le main :
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
Hors ligne
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 :
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.
Hors ligne
Merci pour ta réponse!
Malheureusement, ça ne fonctionne toujours pas. J'ai effectué un nouveau test et je retrouve le même résultat étonnant : la position de l'objet est bien mise a jour mais c'est comme-ci le programme oubliait cette mise à jour et laissait le cube à ça place!
Une image parle peut-être mieux :
Ici, position 2 est la position du cube avant le déplacement, position_monstres est la variable de déplacement, position 1 est la position du cube après déplacement. On peut remarquer que position 2 ne change pas entre 2frames alors que position_monstre et position 1 changent et sont d'ailleurs égales ce qui signifie que la position à bien été mise à jour... Je suis donc complètement perdu surtout que ça marche une fois au début (le cube commence à X = -44,0). (les deux frames sont consécutives)
Sinon, y aurait-t-il une solution pour faire accepter les collision lors d'un follow spline? (parce qu'au moins avec le followspline les cubes bougent ) J'ai eu beau chercher, je n'ai absolument rien trouvé là dessus!
Bonne prog!
Super-Vlan
PS : j'ai réduit la vitesse de déplacement pour être sur de voir quelque chose et que ce ne soit pas trop rapide (mais le même test avec une vitesse de déplacement plus élevé donne exactement le même résultat)!
Hors ligne
C'est tes animators de collision qui doivent remettre le node dans son ancienne position entre le moment ou tu bouges et celui ou tu affiches.
Hors ligne
Eh oui!!!
Je suis bête! En y regardant de plus près, les cubes n'étaient en collision qu'avec eux-même du coup il ne bougeait pas!
Merci beaucoup! Maintenant, ça marche!
Dernière modification par Super-Vlan (26-05-2013 11:09:06)
Hors ligne
Je profite d'avoir ouvert ce sujet pour vous posez une autre question.
Comment puis-je savoir qu'une collision à lieu entre l'un des cubes et le terrain avec le code que j'ai écrit?
Mon problème est que tous les tutos et morceaux de code que j'ai pus trouver sur le collisionOccurred ou getCollisionPoint n'utilise qu'un seul objet et tout est dans le main donc l'animator est facilement accessible! Mais là, mon animator est dans une autre fonction et il est remis à zéro après chaque assignation à un cube...
Auriez-vous une solution à mon problème où faut-il que je change radicalement de méthodes? (Encore faut-il que je trouve une autre méthode =/ )
Super-Vlan
Hors ligne
Hors ligne
Je ne vois malheureusement pas comment utiliser le IMetaTriangleSelector!
J'ai tenté de créer un nouveau ISceneNodeAnimatorCollisionResponse entre le IMetaTriangleSelector du Terrain (je souhaite, pour le moment, m'attarder uniquement sur le comportement des cubes lors d'une collision avec le terrain), et le cube dans la fonction de déplacement mais le collisionOccurred reste faux (peut-être est-il nécessaire d'attacher le nouveau animator au cube mais dans ce cas le programme en ajoute un à chaque frame est j'ai pus vérifier que ce n'était pas bon du tout!).
Pourrais-tu préciser quelques peu ta solution car je ne comprends pas vraiment comment faire?
Super-Vlan
Hors ligne
Hors ligne
J'ai réglé mon problème! Celui-ci provenait de la création des cubes. En effet, chacun étaient un mesh unique auquel j'assignais le même animator légèrement modifié ce qui m'empêchais de le réutiliser dans une autre fonction.
Mon ancien code de création des cubes:
Mon nouveau code qui me permet de récupérer le CollisionResponse du terrain!
@Magun & johnplayer : Je vous remercie pour votre aide mais le problème n'était pas dans la création du gestionnaire de collision mais dans son utilisation dans une autre fonction! Je pense que je me suis mal expliqué et j'essaierais d'être plus clair la prochaine fois!
Merci encore!
Super-Vlan
Hors ligne