如何在调用方法后删除对象?

时间:2017-10-11 12:39:09

标签: java object arraylist

我在做一个电脑游戏。我需要的是:在物体炸弹进行攻击后,我想将她从ArrayList<Entity>移除。

Entity是我所有敌人的抽象类,比如炸弹,弓箭手......我使用ArrayList表示我需要绘制和更新的内容。如果可能,我想删除该对象,而不仅仅是ArrayList

这是我的GameEngine类代码:

    public class GameEngine {
      gameEntities = new ArrayList<Entity>();
      Bomb bomb1;

      bomb1 = new Bomb();
      gameEntities.add(bomb1)
      public void update() {   
        for(Entity entity : gameEntities){
            entity.whatNow();
        }        
      }
    }

和其他课程:

    public class Bomb extends Entity { 
      void whatNow() {
        GameData.entityRemove(this);
      }
    }

    public class GameData {
      static void entityRemove(Entity entity) {
        for(Entity listEntity : GameEngine.gameEntities){
            if(entity == listEntity){
                 listEntity = null;
                 GameEngine.gameEntities.remove(listEntity);
            }
      }
    }

3 个答案:

答案 0 :(得分:0)

您的上下文中的Entity不应该直接访问GameEngine的元素。我宁愿建议这样的事情:

  • 您的引擎有两个列表:一个用于current个内容,一个用于future个内容
  • 您的代码只需通过current列表
  • 处理条目时会导致future事件,应该在主addFuture(Entity whatever)对象上调用GameEngine等方法
  • 当您处理current列表时 - 然后清除current移动 future中的所有条目
  • 然后您清除future并再次开始处理current

换句话说:避免删除条目。只需处理一次清单,扔掉它并收集新的&#34;第二个列表中的条目。

无关:阅读@Override注释并开始使用它。

答案 1 :(得分:0)

你应该让炸弹标记为&#34; toClean&#34;并让GameEnginewhatNow()更新后删除它们(我假设您的GameEngine是单身人士):

public class Bomb extends Entity { 
  void whatNow() {
    // do my bomb stuff
    GameEngine.instance().remove(this);
  }
}

public class GameEngine {

  // Declare a gameEntitiesToRemove queue/list

  public void update() {
    for(Entity entity : gameEntities){
       entity.whatNow();
    }
    while(gameEntitiesToRemove.hasNext()){
       gameEntities.remove(gameEntitiesToRemove.pop());
    }
  }

  public void remove(Entity entity) {
    this.gameEntitiesToRemove.add(entity);
  }
}

答案 2 :(得分:0)

问题在于for循环中的if子句:

listEntity = null;
GameEngine.gameEntities.remove(listEntity);

如果listEntity在第一行中不设置为null,则第二行将从ArrayList中删除listEntity。现在它尝试从列表中删除null,这可能不是你想要的。

至少,交换这两行。然而,将 listEntity 设置为null确实没有意义,因为无论如何它将在该循环之后消失。