2014-09-28 6 views
1

У меня возникла проблема с удалением/созданием тел в libGDX (box2d). Я получаю фатальную ошибку. Log:Удаление и создание тела в libGDX

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

ответ

2

Я вижу только одну ошибку в вас код, я не уверен, что это приводит к аварии, но вы должны это исправить.

Вы не должны удалять элементы из массива в то же самое время, когда вы перебираете один и тот же массив. Это может привести к непредсказуемым ошибкам, потому что каждый раз, когда вы удаляете элемент, массив изменяет порядок элементов и уменьшает размер. Решение состоит в создании временного массива и его петли, поэтому вы сможете удалить элементы из оригинала.

Также вы можете позвонить по телефону deleteObjects()? Вы должны позвонить по телефону render(), после world.step(), а не в beginContact() или endContact().

Смежные вопросы