#0 

19-03-2014 22:27:47

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Bonjour,

Cela fait plusieurs fois que je suis confronté au même problème. J'aimerais appeler dans ma boucle de rendu une fonction qui fait un Node->removeChild(). Le soucis c'est que selon les conditions que je test l'appel à ma fonction s'effectue plusieurs fois et ducoups le removeChild() est appelé alors que l'enfant n'existe plus. J'ai tout essayé avec des test booleens mais rien n'y fait j'ai le droit à un jolis plantage !

Code c++ :

void Player::perdreBrasDroit(){
        NodePlayer->removeChild(NBrasDroite);
}


Dans ma boucle de rendu :

Code c++ :

   OdrPdrBrasDt_1 = player1.TestOfCollisionWithCubePlayer(player2.getPlayer()); ------> Test de collision entre deux nodes

   if(OdrPdrBrasDt_1 == true){
                player1.perdreBrasDroit();
        }


Enfait je voudrais realiser ce changement d'etat :

Code:

Ordre de perte du bras (donnee d'entree) :               Resultat de ma variable de test pour l'appel de la fonction :
0                                                                                         1
0                                                                                         1
0                                                                                         1
0                                                                                         1
1 -> passage de collision entre les nodes                                                 0 -> un seul changement
1                                                                                         1
1                                                                                         1
1                                                                                         1
0                                                                                         1
0                                                                                         1

Si quelqu'un à la réponse, merci d'avance.

Dernière modification par jonath313 (19-03-2014 23:19:57)

Hors ligne


#1 

20-03-2014 20:29:37

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Teste l'existance du node!

Code c++ :


void Player::perdreBrasDroit()
{
        if( NBrasDroite )
              if( NodePlayer->removeChild(NBrasDroite) )
                      NBrasDroite = null;
}


Si ça persiste, c'est que ton node est utilisé par une autre partie de ton programme (par exemple, ton test de collision).


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


#2 

20-03-2014 21:48:36

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Oui merci c'est exactement çà, je viens juste de le corriger, enfait je faisais un setframeloop() dans une autre fonction qui appelait toujours le node du bras (sans condition).

je me suis aussi aperçut que le removechild fait disparaitre le bras alors que moi je voulais juste le décrocher et le laisser à l'endroit où il à été décroché.(voir par la suite le faire tomber sur le sol)

Du coups je me suis dis que çà serait plus fun de relier les OS des membres séparés d'un personnage pour pouvoirs le démembrer et là je me rend comptes que déjà niveaux code c'est lourd à gérer et ensuite que deux bones ne se lient pas. (je peux me tromper dans mes paroles hein...)

Code:

irr::scene::IBoneSceneNode* OSBrasDroiteH = NBrasDroite->getJointNode("Bone16"); 
irr::scene::IBoneSceneNode* OSTroncEpauleDrte = NTronc->getJointNode("Bone30"); 

OSTroncEpauleDrte      ->addChild(OSBrasDroiteH);

Sinon j'ai essayé çà mais idem çà ne fonctionne pas ... le bras disparaît et moi je veux juste le détacher de son parent :

Code:

NBrasDroite->grab() ;
NBrasDroite->setParent(0);
NBrasDroite->drop() ;

Savez-vous comment je peux réaliser le démembrements svp ? (sinon j'avais pensé mettre le bras enfant du terrain plutot que de le remove mais çà me plait pas sad ).

Dernière modification par jonath313 (20-03-2014 23:05:04)

Hors ligne


#3 

21-03-2014 09:17:18

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

tu peux toujours le cacher au lieu de le détruire avec "ISceneNode::setVisible(bool visible);".
Niveau perf je ne suis pas sûr que ça dérange beaucoup mais au moins, tu peux faire réapparaitre ton node si besoin.


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


#4 

21-03-2014 11:21:23

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Non c'est pas ce que je veux faire. Avant le addchild j'ai 2 node et après ils sont collé ensemble. Mais si je veux supprimer cette liaison pour retrouver 2 node bien distinct je fait comment? Je veux supprimer la liaison et pas un node.

Hors ligne


#5 

21-03-2014 20:34:38

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

Ton node disparait peut-être parce qu'il n'a plus la bonne position. Tu peut toujours essayer ça:

Code c++ :


vector3df posabs = NBrasDroite->getAbsolutePosition(); // position par rapport au terrain
NBrasDroite->setParent( newParent ); // change le parent
NBrasDroite->setPosition( posabs  - newParent->getAbsolutePosition() ); // place le node par rapport au nouveau parent

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


#6 

21-03-2014 21:09:26

jonath313
Abonné
Date d'inscription: 28-12-2009
Messages: 240

Ok j'ai fais le test de passer le parent au terrain mais du coups le bras sectionné est bien séparé mais est joint au terrain à un emplacement précis, il ne tombera donc pas sur le sol.

Pour faire simple, je n'utilise plus de addchild() ou de setParent(), je place directement les membres de mon personnage aux positions et rotations de celui-ci. Quand j'ai collision, j'arréte de faire suivre les membres au personnage. Comme cela il s'arrétent à la position de collision. Je leur impose une gravité sur leur animator de collision en faisant un anim->setGravity(Gravite) et là ils tombent sur le sol.

Donc problème résolu. Merci de vos réponses çà m'a bien aidé dans mon raisonnement.

Par la suite je pense que je devrais utiliser un moteur physique pour que le bras tombe bien allongé sur le sol.

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
883 membres
1429 sujets
11121 messages
Dernier membre inscrit: Saidov17
124 invités en ligne
Aucun membre connecté
RSS Feed