我在做一个电脑游戏。我需要的是:在物体炸弹进行攻击后,我想将她从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);
}
}
}
答案 0 :(得分:0)
您的上下文中的Entity
不应该直接访问GameEngine
的元素。我宁愿建议这样的事情:
current
个内容,一个用于future
个内容current
列表future
事件,应该在主addFuture(Entity whatever)
对象上调用GameEngine
等方法current
列表时 - 然后清除current
并移动 future
中的所有条目future
并再次开始处理current
换句话说:避免删除条目。只需处理一次清单,扔掉它并收集新的&#34;第二个列表中的条目。
无关:阅读@Override注释并开始使用它。
答案 1 :(得分:0)
你应该让炸弹标记为&#34; toClean&#34;并让GameEngine
在whatNow()
更新后删除它们(我假设您的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确实没有意义,因为无论如何它将在该循环之后消失。