在libGDX中删除和创建正文

我在libGDX(box2d)中删除/创建实体时遇到问题。 我得到一个致命的错误。 日志:

http://pastebin.com/fXWXpe8N

碰撞后我试图摧毁尸体。 ~90%的遗体被删除良好,没有错误和崩溃。 但有时它会发生。 我该如何解决这个错误? 我不知道。

联系:

private void bulletGround(Contact contact) { Body bodyA = null; Body bodyB = null; if(contact.getFixtureA() != null && contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals(Ground.USERDATA)) bodyA = contact.getFixtureA().getBody(); if(contact.getFixtureB() != null && contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals(Bullet.USERDATA)) bodyB = contact.getFixtureB().getBody(); if(bodyA != null && bodyB != null) { if(!world.deletingList.contains(bodyB, true)) { world.deletingList.add(bodyB); } } } private void bulletEnemy(Contact contact) { Body bodyA = null; Body bodyB = null; if(contact.getFixtureA() != null && contact.getFixtureA().getUserData() != null && contact.getFixtureA().getUserData().equals(Enemy.USERDATA)) bodyA = contact.getFixtureA().getBody(); if(contact.getFixtureB() != null && contact.getFixtureB().getUserData() != null && contact.getFixtureB().getUserData().equals(Bullet.USERDATA)) bodyB = contact.getFixtureB().getBody(); if(bodyA != null && bodyB != null) { if(!world.deletingList.contains(bodyB, true) && !world.deletingList.contains(bodyA, true)) { world.deletingList.add(bodyB); world.deletingList.add(bodyA); } } } 

删除:

 private void deleteObjects() { for (int i = 0; i  0 && !gameWorld.getWorld().isLocked()) { gameWorld.isDeletingTime = true; body.setUserData(null); body.setActive(false); gameWorld.getWorld().destroyBody(body); gameWorld.deletingList.removeIndex(i); } } gameWorld.isDeletingTime = false; } 

创建:

  render: if(shootButton.isPressed()) { if(framesForShoot / Gdx.graphics.getFramesPerSecond() > Info.shootingSpeed) { bullet = new Bullet(worldGame, renderer.getGun().getBody().getPosition().x - renderer.angle0fGun, renderer.getGun().getBody().getPosition().y, renderer.angle0fGun); renderer.bulletList.add(bullet); framesForShoot = 0; } } public class Bullet { public static final String USERDATA = "bullet"; private GameWorld world; private Body body; private Vector2 position; public Texture bullet_texture; public Bullet(GameWorld world, float startX, float startY, float pos) { this.world = world; body = this.world.createBox(BodyDef.BodyType.DynamicBody, 0.5f, 0.5f, 0); body.setTransform(startX, startY, 0); body.getFixtureList().get(0).setUserData(USERDATA); bullet_texture = new Texture(Gdx.files.internal("data/bullet.png")); } 

我看到你的代码中只有一个错误,我不确定它是否会导致崩溃,但你应该以任何方式修复它。

 gameWorld.deletingList.removeIndex(i); 

在通过相同的数组循环的同时,不得从数组中删除项目。 这可能导致不可预测的错误,因为每次删除项目时,数组都会更改项目顺序并减小大小。 解决方案是创建临时数组并通过它循环,这样您就可以从原始数组中删除项目。

你在哪里调用deleteObjects() ? 您应该在world.step()之后调用render() ,而不是在beginContact()endContact ()中endContact