1

我正在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);
}

我在世界步进函数之后调用 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;

任何人都可以在这里帮助我吗?

4

2 回答 2

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);
    }
于 2013-05-24T11:18:32.103 回答
1

谢谢你的关心..我已经解决了这个问题..而且,游戏没有冻结,只是尸体没有被移除。我这样解决了它,我制作了一个需要删除的主体数组(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);
   }
于 2013-05-27T08:04:31.320 回答