Bonjour à tous,
Voilà je développe un jeu avec Irrlicht et Codeblocks et j'ai besoin de supprimer une node et de la recréer juste ensuite à un endroit différent.
Le problème est que le programme crash lorsqu'il arrive à cet endroit. Le bout de code concerné :
node->remove(); node = 0; scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(model); node->getMaterial(0) = material2; node->setPosition(core::vector3df(5,-1000,5)); node->setRotation(core::vector3df(0,90,0)); node->setLoopMode(true); node->setMD2Animation(scene::EMAT_STAND);
Ce bout de code se situe dans la boucle de rendu.
Plus tôt, en dehors de la boucle, j'avais déclaré :
video::SMaterial material2; material2.Texture1 = driver->getTexture("3D/texture.jpg"); scene::IAnimatedMesh* model = smgr->getMesh("3D/player.md2"); scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(model); node->setPosition(core::vector3df(spotx[3],0,spoty[3])); node->setRotation(core::vector3df(0,srotz[3],0)); node->getMaterial(0) = material2; node->setMD2Animation(scene::EMAT_STAND);
Aidez-moi vite s'il vous plait car c'est pour une compétition.
Merci beaucoup,
Altair.
Hors ligne
Salut Altaïr !
Je pense que le problème est le fait que ton code qui recrée le node soit situé dans la boucle de rendu car ton ordinateur le recrée a chaque fois. D'autre part, ton fichier 3D peut contenir une erreur de frappe au niveau du nom. Si rien ne marche, ça peut aussi être parce que tu réécris
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(model);
alors qu'il suffirait d'un
node = smgr->addAnimatedMeshSceneNode(model);
Voila Teste et dit moi, je te rerépondrai si tu as besoin
Dernière modification par iLambda² (26-08-2010 23:26:45)
Hors ligne
Altair :
... c'est pour une compétition.....
c'est quoi cette compet ?
Hors ligne
iLambda² :
Salut Altaïr !
Je pense que le probleme est le fait que ton code qui recrée le node soit situé dans la boucle de rendu car ton ordinateur le recrée a chaque fois. D'autre part, ton fichier 3D peut contenir une erreur de frappe au niveau du nom. Si rien ne marche, ca peut aussi etre parceque tu réécritCode:
scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(model);alors qu'il suffirait d'un
Code:
node = smgr->addAnimatedMeshSceneNode(model);Voila Teste et dit moi, je te rerépondrait si tu as besoin
Merci beaucoup pour ton aide !
Le code qui recrée le node est situé dans une condition qui ne s'éxécute qu'une seule fois, et le fichier 3D se charge très bien au début, c'est lorsque vient le moment de le supprimer et de le replacer à un nouveau endroit que ça crash.
En fait si tu vais je fais un jeu de zombies et une fois que le zombie est rentré dans l'hopital, si il est tué, je peux pas le faire ressortir parce qu'il est bloqué par les murs de l'hopital. Il faut donc que je le supprime et que je le recrée en dehors, pour le téléporter en quelque sorte.
En effet si je ne supprime pas le node et que je fais node = smgr->addAnimatedMeshSceneNode(model);, alors ça ne crash pas, mais le cadavre de l'ancien zombie reste par terre alors que je veux qu'il disparaisse (De l'écran et de la mémoire lol).
Est-ce que tu penses que je peux supprimer l'animator de collision de la node, la bouger, et la lui ré-assigner ensuite, même si j'ai fais animator->drop() après l'avoir crée en dehors de la boucle ?
Merci encore !
nico :
[quote=Altair]... c'est pour une compétition.....
c'est quoi cette compet ? [/quote]
Je voulais pas trop le dire car j'ai cru comprendre que vous le détestiez ici, mais c'est pour cette compétition :
http://www.psp-hacks.com/2010/05/17/hom … rror-show/
J'utilise le LTE game engine, une adaptation de Irrlicht sur PSP. Je fais mes tests sur l'ordinateur avec le vrai Irrlicht et Codeblocks d'abord, puis je porterais mon projet sur PSP ensuite.
Dernière modification par Altair (27-08-2010 13:53:40)
Hors ligne
ba pourquoi ne pas faire un simple setPosition ? o.O
je veux dire où est l'intérêt ? aurais tu une autre contrainte ? physique (autre que les babioles de irrlicht) ?
supprimer et recréer, ça aurait été envisageable si tu changeais des données critiques, mais irrlicht est plutôt safe de ce côté là ...
sinon tu peux faire un node->drop ?
il est probable que tu utilises plusieurs fois le mesh, là où node->remove le supprime également, il me semble qu'il ne fait qu'un drop du mesh pourtant
mais si c'est un <<driver->removeHardwareBuffer ?>> du coup tes autres nodes se retrouvent avec un pointeur invalide ?
ps1: je ne connais pas LTE engine, mais il ne faut pas exclure un bug de celui-ci, essaye de mettre à jour ...
ps2: à ma connaissance personne ne déteste les concours ici, mais ça ne me fait pas non plus sauter de joie ...
edit: essaye de corriger
Dernière modification par Magun (27-08-2010 14:57:48)
Hors ligne
+3 magun
pourquoi reloader un mesh quant il suffit de le téléporter ?
s'il doit attendre tu le cache :
setVisible(bool)
Donc +1 pour cette réponse pertinente.
et +2 pour l'écriture parfaite
ps: tu aurais pu te donner la peine de faire un tableau de chaines pour tes ps[] :p
Hors ligne
Altair :
Je voulais pas trop le dire car j'ai cru comprendre que vous le détestiez ici
détester quoi ? le LTE engine ? je n'ai pas souvenir qu'on en ai parlé ici, sinon j'ai déjà prog vite fait sur psp et je me souviens que c'est un vrai défi, donc bon courage
Hors ligne