2010-02-12 2 views
2

Quelle est la bonne façon de supprimer un corps de Chipmunk? Le simple fait d'appeler le cpBodyFree ou le cpBodyDestroy ne semble pas fonctionner, car le corps apparaît toujours dans l'itération cpSpaceEachBody.Chipmunk: comment supprimer un corps?

if(body->p.y < -260 || fabsf(body->p.x) > 340) { 
    /* body is permanently off the screen */ 
    /* so it needs to be permanently deleted */ 
    cpBodyFree(body);  ?? 
    cpBodyDestroy(body); ?? 
} 
+2

OK , pour quelqu'un qui n'a jamais entendu parler de ce dont vous parlez, c'est un début étrange à la question. –

+0

étonnamment, ce n'est pas une bibliothèque Ruby cette fois – Jimmy

+1

@mmyers, il n'a pas l'air bizarre jusqu'à ce que vous l'ayez fait remarquer. Bonne chose ce n'est pas un paquet appelé Mes collègues! –

Répondre

4

Voici comment supprimer un corps:

  1. S'il y a une forme associée au corps, retirez la forme de l'espace et supprimez-la.
  2. retirer le corps de l'espace. (c'est la partie qui me manquait.)
  3. supprimer l'espace.

Voici comment faire pleuvoir la démo Plink le long d'une seule douche de pentagones et les nettoyer lorsque ils sortent de l'écran.

  1. Ajoutez cette ligne à la boucle "// Add lots of pentagons". C'est ainsi que nous pouvons libérer la forme attachée au corps. Enlever la forme et le corps de l'espace, puis libérer la forme et le corps. Il ne semble pas important si vous supprimez/libérez la forme d'abord ou le corps d'abord, tant que vous gardez à l'esprit que vous perdez le pointeur à la forme lorsque vous libérez le corps. Changer la fonction eachBody à:

    if (body->p.y < -260) { 
        cpSpaceRemoveShape(space, body->data); 
        cpSpaceRemoveBody(space, body); 
        cpShapeFree(body->data); 
        cpBodyFree(body); 
    } 
    
+0

ok mais vous supprimez seulement l'espace si vous ne le voulez plus, non? Si vous avez d'autres corps de tamia, vous devez garder l'espace, n'est-ce pas? – marciokoko

+0

@mars, c'est vrai. –

+0

ok, Im essayant d'appeler une méthode à partir d'une méthode statique cpBool begin ou preSolve chipmunk. J'ai mis ceci mais bien sûr cela n'a pas fonctionné car ce n'est pas du code C++ mais plutôt objC. [self removeShield: bouclier]; Comment est-ce que j'écrirais cela en C++? – marciokoko

0

Après avoir regardé dans le lib code

void cpBodyDestroy(cpBody *body){} 

void 
cpBodyFree(cpBody *body) 
{ 
    if(body){ 
     cpBodyDestroy(body); 
     cpfree(body); 
    } 
} 

Appel cpBodyFree (il appelle en interne cpBodyDestroy interne

MISE À JOUR:. Sauf dans les cas où vous n'avez pas besoin de la validation et l'appel cpfree(body);

0

vous devez vous assurer que la forme a été ajoutée comme statique ou non, peut-être ce code vous aidera un peu:

if(shape != NULL) 
    { 
     int isStatic = 1; 
     cpBody *bd = cpShapeGetBody(shape); 
     if(bd != NULL) 
     { 
      if(!cpBodyIsRogue(bd) && !cpBodyIsStatic(bd)) //second condition is just to make sure 
      { 
       isStatic = 0; 
       cpSpace *sp1 = cpBodyGetSpace(bd); 
       if(sp1 != NULL) 
       { 
        cpSpaceRemoveBody(sp1, bd); //remove body from space and then free it 
       } 
      } 
      cpBodyFree(bd); 
     } 

     cpSpace *sp = cpShapeGetSpace(shape); 
     if(sp != NULL) 
     { 
      if(isStatic) 
       cpSpaceRemoveStaticShape(sp, shape); 
      else 
       cpSpaceRemoveShape(sp, shape); //remove shape from space and then free it 
     } 

     cpShapeFree(shape); 
     shape = NULL; 
    } 
Questions connexes