我在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);
}
我在World步骤函数之后调用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;
有人能帮我吗?
最佳答案
谢谢你的关心。我已经解决了这个问题。而且,游戏并没有冻结,只是尸体不会被移除。
我就这样解决了,
我制作了一个需要删除的实体数组(死体),在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);
}