2014-09-28 85 views
1

我在libGDX(box2d)中刪除/創建主體時遇到問題。 我收到一個致命錯誤。 日誌:在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

我只看到一個錯誤在你的代碼,我不知道,它會導致死機,但你應該以任何方式修復它。

gameWorld.deletingList.removeIndex(i); 

在循環同一個數組的同時,您不能從數組中刪除項目。這可能會導致不可預知的錯誤,因爲每次刪除項目時,該數組都會更改項目順序並減小大小。解決方案是創建臨時數組並通過它循環,以便您可以從原始數組中刪除項目。您也可以致電deleteObjects()?您應在world.step()之後撥打電話render(),而不要撥打beginContact()endContact()。