java android libgdx box2d

java - Eliminando y creando cuerpo en libGDX



android box2d (1)

Solo veo un error en tu código, no estoy seguro de que cause el bloqueo, pero debes solucionarlo de cualquier forma.

gameWorld.deletingList.removeIndex(i);

No debe eliminar elementos de la matriz al mismo tiempo que realiza un bucle a través de la misma matriz. Esto puede provocar errores impredecibles, ya que cada vez que elimine un elemento, la matriz cambiará el orden de los elementos y disminuirá el tamaño. La solución es crear una matriz temporal y hacer un bucle a través de ella, por lo que podrá eliminar elementos de la original.

¿También a dónde llamas tus deleteObjects() ? Debería invocar en render() , después de world.step() y no en beginContact() o endContact ().

Tengo un problema con eliminar / crear cuerpos en libGDX (box2d). Me sale un error fatal. Iniciar sesión:

http://pastebin.com/fXWXpe8N

Intento destruir los cuerpos después de la colisión. ~ 90% de los cuerpos se eliminan bien, sin errores y bloqueos. Pero a veces sucede. ¿Cómo puedo solucionar este error? No tengo idea.

Contacto:

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

Eliminando:

private void deleteObjects() { for (int i = 0; i < gameWorld.deletingList.size; i++) { Body body = gameWorld.deletingList.get(i); if (body != null && body.getFixtureList().size > 0 && !gameWorld.getWorld().isLocked()) { gameWorld.isDeletingTime = true; body.setUserData(null); body.setActive(false); gameWorld.getWorld().destroyBody(body); gameWorld.deletingList.removeIndex(i); } } gameWorld.isDeletingTime = false; }

Creando:

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