Box2D主体未立即移除(LibGDX Android)

Box2D主体未立即移除(LibGDX Android),android,box2d,libgdx,physics,game-engine,Android,Box2d,Libgdx,Physics,Game Engine,我正在android上学习libGDX。我试图在碰撞后将尸体从世界上移除。但是,有些时候,尸体不会立即移除,需要2-3秒才能正确移除 private void deleteDeadBodies(){ Iterator<Body> i = world.getBodies(); Body node=i.next(); while (i.hasNext()) { Body oBj=node; node=i.next();

我正在android上学习libGDX。我试图在碰撞后将尸体从世界上移除。但是,有些时候,尸体不会立即移除,需要2-3秒才能正确移除

    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);
}

有人能帮我吗

代码看起来有点奇怪

你为什么不这样做:

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

    while (i.hasNext()) {
        node=i.next();
        if(node.getUserData() == Constants.BodyType.DESTROY){     
            removeBodySafely(node);
        }
    }
确实要在while循环中多次检索同一项吗

试试这个:

 final ArrayList<JointEdge> list = body.getJointList();
    for(JointEdge edge : list)
        world.destroyJoint(edge.joint);
    }
final ArrayList list=body.getJointList();
用于(连接边:列表)
世界.联合(边.联合);
}

谢谢您的关注。。我已经解决了这个问题。。而且,游戏并没有冻结,只是尸体不会被移走。 我就这样解决了,, 我制作了一个需要删除的实体数组(DeadBody),在contact listener的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);
   }
公共无效更新(浮动增量、浮动加速度){
累加器+=增量;
while(累加器>常量。方框\u步骤){
步长(常数.BOX\u步长,常数.BOX\u速度\u迭代,常数.BOX\u位置\u迭代);
累加器-=常数。框_步;
}
移除的实体();
}
私有无效已删除的主体(){
对于(int i=0;i 0){
world.destroyJoint(list.get(0.joint));
}
世界。毁灭体(body);
}
 final ArrayList<JointEdge> list = body.getJointList();
    for(JointEdge edge : list)
        world.destroyJoint(edge.joint);
    }
       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);
   }