Pages: 1
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
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.
Hors ligne
Merci, cela pourrait être une solution mais j'aimerai éviter d'avoir à parcourir tous les Nodes Fils à chaque appel...
Hors ligne
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:
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.
Hors ligne
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
Pages: 1