2013-05-23 3 views
2

Я изучаю libGDX на Android. Я пытаюсь удалить тело из мира после столкновения. Но, несколько раз, тела не удаляются немедленно, требуется 2-3 секунды для правильного удаления.Box2D Body не удаляется сразу (LibGDX Android)

private void deleteDeadBodies(){ 
    Iterator<Body> i = world.getBodies(); 
    Body node=i.next(); 
    while (i.hasNext()) { 
     Body oBj=node; 
     node=i.next(); 
     if(oBj.getUserData() == Constants.BodyType.DESTROY){  
      removeBodySafely(oBj); 
     } 
    } 
} 

private void removeBodySafely(Body body) { 
    final ArrayList<JointEdge> list = body.getJointList(); 
    while (list.size() > 0) { 
     world.destroyJoint(list.get(0).joint); 
    } 
    world.destroyBody(body); 
} 

Я вызываю deleteDeadBodies() после функций мирового шага. Мой мир шаг параметры,

public static final float BOX_STEP = 1/80f; 
public static final int BOX_VELOCITY_ITERATIONS = 6; 
public static final int BOX_POSITION_ITERATIONS = 2; 

Может ли тело помочь мне здесь?

ответ

2

Благодарим Вас за беспокойство .. Я решил проблему .. и игра не замерзал, только тела не получают удалены. Я решил это так: Я создал массив (deadBodies) тел, которые необходимо удалить, добавьте тела в этот массив на метод postSolve для прослушивания контактов.

Тогда я вновь построить свой код, как это,

 public void update(float delta , float accelX){ 
     accumulator += delta; 
     while(accumulator>Constants.BOX_STEP){ 
     world.step(Constants.BOX_STEP,Constants.BOX_VELOCITY_ITERATIONS,Constants.BOX_POSITION_ITERATIONS);   
     accumulator -= Constants.BOX_STEP; 
     } 
     removeDeadBodies(); 
     } 
    private void removeDeadBodies(){ 
     for(int i = 0; i<deadBodies.size();i++){ 
     Body body = deadBodies.get(i); 
     if(!world.isLocked() && body != null){ 
      removeBodySafely(body); 
      deadBodies.remove(body); 
     } 
     } 
    } 

    private void removeBodySafely(Body body) { 
     final Array<JointEdge> list = body.getJointList(); 
     while (list.size > 0) { 
     world.destroyJoint(list.get(0).joint); 
     } 
     world.destroyBody(body); 
    } 
1

Код выглядит немного странно ...

Почему бы вам не сделать так:

Iterator<Body> i = world.getBodies(); 
    Body node; 

    while (i.hasNext()) { 
     node=i.next(); 
     if(node.getUserData() == Constants.BodyType.DESTROY){  
      removeBodySafely(node); 
     } 
    } 

Кроме того, это выглядит странно:

world.destroyJoint(list.get(0).joint); 

Вы уверены, хотите получить один и тот же элемент несколько раз в цикле while?

Попробуйте это:

final ArrayList<JointEdge> list = body.getJointList(); 
    for(JointEdge edge : list) 
     world.destroyJoint(edge.joint); 
    }