Pages: 1
- Accueil forums
- » Aide Irrlicht C++
- » Problème de hierarchie et d'identifiants avec getSceneNodeFromId
12-10-2013 07:39:27
- Memorial76
- Membres
- Date d'inscription:
- Messages: 67
- IP: 92.152.172.84
- Courriel
Bonjour,
j'ai une scène dans laquelle un EmptySceneNode d'identifiant 0 (zéro) a des SceneNode filles dont les identifiants vont de 0 à n
Lorsque je veux redessiner ces éléments j'appelle cette fonction:
void CDrawTactical::updateHexagone(int nId, bool bVegetation)
{
scene::ISceneNode* pParent = m_pSceneMgr->getSceneNodeFromId(ID3D_CASE_PARENT);
scene::ISceneNode* pNodeHex = m_pSceneMgr->getSceneNodeFromId(nId, pParent);
createHexagone(pParent, nId, bVegetation);
if( bVegetation )
createHexagoneHighVegetation(nId);
pNodeHex->remove();
}
dans l'ordre:
- >stock le fameux EmptySceneNode d'identifiant 0 dans pParent, stock le SceneNode fille d'identifiant nId dans pNodeHex en commençant la recherche sur les enfants de pParent. (Pour info, les SceneNode sont des CustomSceneNode)
- >crée un nouveau SceneNode par la fonction createHexagone(...)
- >supprime l'ancien SceneNode (pNodeHex)
Tout fonctionne très bien SAUF pour le pNodeHex d'identifiant 0 où c'est (à priori pParent qui est supprimé) et non le pNodeHex d'identifiant 0 (avec pour résultat la suppression de tous les SceneNodes sauf 1: le nouveau SceneNode d'identifiant 0)
Je vois deux causes possibles soit un problème de pointeur qui ne pointe plus là où je pense, soit un problème de la fonction getSceneNodeFromId qui inclue dans sa recherche le node "pParent" qui est donc retourné en lieu et place du pNodeHex d'identifiant 0 voulu...
Merci d'avance à ceux qui pourront éclairer mes lanternes.
Hors ligne
12-10-2013 09:13:52
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.85.181
- Courriel
Normal qu'il supprime ton parent. Il commence à pParent et celui-ci à son ID = 0.
Diriges toi plutôt vers ISceneNode::getChildren ()" qui te renvoie une liste des enfant de ton node.
Code c++ :
ISceneNode* getChildByID(ISceneNode* parent, u32 IDenfant)
{
list<ISceneNode*> liste_enfants = nParent->getChildren();
for(u32 a=0; a < liste_enfants.size(); a++)
if(liste_enfants[a].getID() == IDenfant)
return liste_enfants[a];
return NULL;
}
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
12-10-2013 09:37:58
- Memorial76
- Membres
- Date d'inscription:
- Messages: 67
- IP: 92.152.172.84
- Courriel
Merci, cela pourrait être une solution mais j'aimerai éviter d'avoir à parcourir tous les Nodes Fils à chaque appel...
Hors ligne
12-10-2013 10:33:49
- johnplayer
- Membres

- Date d'inscription:
- Messages: 431
- IP: 83.192.85.181
- Courriel
Tu n'as pas d'autres choix que de parcourir les enfants (pas forcément tous car il s'arrête lorsque qu'il a trouvé l'enfant), c'est d'ailleurs ce que fait "getSceneNodeFromId". Il n'y a pas de miracle, pour trouver faut chercher dans la liste.
Maintenant, pourquoi ne fait tu pas un update de tous les enfants d'un node en un seul appel. Ce serait trop lourd?
Un truc du genre:
Code c++ :
list<ISceneNode*> liste_enfants = nParent->getChildren();
for(u32 a=0; a < liste_enfants.size(); a++)
updateHexagone(liste_enfants[a], vegetation);
void CDrawTactical::updateHexagone(ISceneNode* pNodeHex, bool bVegetation) // remplacement de nID par le pointeur sur le node
{
createHexagone(pParent, pNodeHex, bVegetation); // remplacement de nID par le pointeur sur le node
if( bVegetation )
createHexagoneHighVegetation(pNodeHex); // remplacement de nID par le pointeur sur le node
pNodeHex->remove();
}
De cette façon, tu ne parcours qu'une fois la liste et tu envoies directement le pointeur sur le node au lieu de l'ID.
core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."
Hors ligne
12-10-2013 10:42:07
- Memorial76
- Membres
- Date d'inscription:
- Messages: 67
- IP: 92.152.172.84
- Courriel
Ceci est en effet fait dans une autre fonction faisant appel à celle-ci.
Mais, dans le cs présent, le node est mis à jour à l'issue d'un clic dessus.
Je vais donc m'orienter vers ta solution
Hors ligne



