Iterator.remove() 删除所有元素,而我想删除一个

Iterator.remove() removes all elements while I want to remove one

存在关于如何从 ArrayList 中删除特定元素而不是 ArrayList 的迭代器的问题。使用下面的代码,它删除了 ArrayList 中的所有元素,但我想删除特定元素,即与播放器发生碰撞的元素。任何人都可以告诉我如何更改此代码以使其这样做吗?提前致谢。

public void update() {
        for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
            Object o = iter.next();
            o.update();
            if(Enemy.collide == true) {
                iter.remove();
            } 
        }  

    }

这是对象 class(敌人和玩家 class 扩展):

    package game;



public abstract class Object {

    protected float x;
    protected float y;
    protected float sX, sY;

    abstract void update();

    public void render() {
        Draw.Rect(x, y, sX, sY);
    }
    public float getX() {
        return x;
    }
    public float getY() {
        return y;
    }
    public float getSX() {
        return sX;
    }
    public float getSY() {
        return sY;
    }
    public float getCenterY() {
        return y + sY/2;
    }
    public void removeObject(Object o) {
        Game.list2.remove(o);
        Game.list = Game.list2;
        Enemy.collide = false;

    }
}

敌人class:

    package game;

import java.util.Iterator;



public class Enemy extends Object {

    private int i = 0;
    private int health = 100;
    private int point = 0;

    static boolean collide = false;

    Enemy(float x, float y) {
        this.x = x;
        this.y = y;
        this.sX = Player.size;
        this.sY = Player.size;
    }


    void update() { 
        if(Physics.checkCollision(this, Game.player)) {
            collide = true;
        }

        if(Math.abs(Game.player.x - this.x) <= 30 && Math.abs(Game.player.x - this.x) >= 1 && Physics.checkCollision(this, Game.player) != true) {
            switch(i) {
            case 1:

                break;
            case 0: 
                if(Game.player.x >= this.x) this.x++;
                if(Game.player.x <= this.x) this.x--;
                if(Game.player.y >= this.y) this.y++;
                if(Game.player.y <= this.y) this.y--;
                break;
            }

        } 




    }


}

玩家class:

package game;

public class Player extends Object {


    public final static  float size = 30;


    public Player(float x, float y) {
        this.x = x;
        this.y = y;
        this.sX = size;
        this.sY = size;
    }
    public void update() {


    }
    public void moveY(double magY) {
        y += magY;
    }
    public void moveX(double magX) {
        x += magX;
    }

}

第一个大问题,请将您的 Object class 重命名为 GameObject。我没有看到任何 import game.Object,因此假设您的 EnemyPlayer class 从 java.lang.Object.

扩展

那么,collide 应该是一个非静态字段,以允许每个实例的冲突。

for(Iterator<Object> iter = list.iterator(); iter.hasNext();) {
    Object o = iter.next();
    o.update();
    if(o.collide == true) {
        iter.remove();
    } 
}  

此外,您可以简单地执行 collide = Physics.checkCollision(this, Game.player 而不是使用 if。这允许在碰撞结束时将 collide 布尔值设置为 false

最后,你应该检查 Physics.checkCollision(this, Game.player) returns 是否是预期的结果 =)

祝你好运!

我注意到的一些 WTFs:

  1. public abstract class Object - 认真的?!不要将您自己的 类 命名为 java.lang 中的 类 或标准库中的其他 类。
  2. static boolean collide = false; ofc 你的迭代器遍历你的列表并删除所有它们。只有那些独立于具体实例的字段才应该是静态的。可能实际问题有所不同,但我强烈建议更改该部分的设计。
  3. float 在处理图形时准确性很差。它应该会导致很多舍入错误。
  4. Physics.checkCollision(this, Game.player) 显示此代码,我还建议将此代码移至 Object 并使用适当的设计模式来处理真正发生碰撞的对象的不同情况。