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

创建:

    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()中调用。

最新更新