0

C'est un problème que je voulais résoudre depuis un moment, bien que je ne puisse jamais trouver un moyen de le réparer. Je pense que je peux manquer quelque chose, mais je n'arrive pas à trouver quoi. J'essaye de détruire des corps du b2World, j'ai vu sur divers tutoriels que quand ils détruisent un objet dans box2d avec le debug draw, la forme est détruite aussi. Pour une raison quelconque, quand je le fais:Box2D Flash, Destroying bodies

world.DestroyBody(_body) il ne semble pas faire quoi que ce soit. La forme reste sur l'écran.

Est-ce que quelqu'un a déjà eu ce problème? Ça m'inquiète car après un moment de jeu, tous les objets que je veux détruire restent à l'écran et enregistrent toujours des collisions qui sont vraiment en retard.

Toute aide serait appréciée,

Merci,
Will

EDIT: [RESOLU] Merci les gars, qui fait sens.

+0

Quand est-ce que vous essayez de supprimer un objet? Si vous essayez de supprimer un objet dans un rappel de gestionnaire de collision, cela pourrait être votre problème. Mattias a la bonne idée de pousser les objets sur une liste et de les traiter en dehors de la méthode de mise à jour de l'objet b2World. –

Répondre

6

J'ai moi-même eu ce problème dans certains projets. Je pense que cela arrive quand vous essayez de retirer un corps qui est "utilisé" par le moteur Box2D. Je l'ai résolu en ajoutant les corps que je veux détruire à une liste et ensuite les détruire avant le rendu suivant.

// add body to list if it should be removed 
if(shouldRemoveBody) 
{ 
    _removeList.push(bodyToRemove); 
} 

// start next render with a check 
if(_removeList.length > 0) 
{ 
    // remove all bodies in list 
} 
3

Pour ajouter à ce qu'a dit Mattias, je fais la même chose qu'il fait, en poussant des objets à la liste ToBeRemoved.

et moi avons une classe d'acteur pour chaque sprite graphique de la scène, voici un code:

public class Actor 
{ 
    protected var m_body:b2Body; 
    protected var m_sprite:DisplayObject; 

    public function Actor(body:b2Body, sprite:DisplayObject) 
    { 
     this.m_body = body; 
     this.m_sprite = sprite; 
    } 

    public function destroy():void 
    { 
     // remove sprite 
     m_sprite.parent.removeChild(m_sprite); 

     // remove physical body 
     GlobalVars.world.DestroyBody(m_body); 
    } 
} 

et chaque fois que je veux détruire un objet, j'appelle simplement détruire la méthode de l'acteur.

Notez que les champs de cette classe sont protégés afin que nous puissions l'étendre par des acteurs enfants.

De cette façon, cela fonctionne sans problème.