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