【问题标题】:Box2D Body is not removed immediately (LibGDX Android)Box2D Body 不会立即被移除 (LibGDX And​​roid)
【发布时间】:2013-05-23 11:52:39
【问题描述】:

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

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

【问题讨论】:

    标签: android box2d libgdx physics game-engine


    【解决方案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);
        }
    

    【讨论】:

      【解决方案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);
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2013-07-05
        相关资源
        最近更新 更多