Java Can';t在2个数组列表上使用equal

Java Can';t在2个数组列表上使用equal,java,android,arraylist,jframe,jpanel,Java,Android,Arraylist,Jframe,Jpanel,所以我有两个数组列表,一个用于球,另一个用于敌人。我想当一个球的x和y坐标等于一个敌人的x和y坐标时,它们都被移除。代码如下: 主要内容: 油漆: import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Iterator;

所以我有两个数组列表,一个用于球,另一个用于敌人。我想当一个球的
x
y
坐标等于一个敌人的
x
y
坐标时,它们都被移除。代码如下:

主要内容:

油漆:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

import javax.swing.JPanel;
import javax.swing.Timer;
public class Paint extends JPanel implements ActionListener{
Timer t = new Timer(5,this);
public int x = 250, y = 450, velx = 0, color = 1,vely = -1,y2 = y, c = 32768, velz = 1;
public ArrayList<Ball> al = new ArrayList<Ball>();
public ArrayList<Enemy> al2 = new ArrayList<Enemy>();
Random rx = new Random();
Random ry = new Random();
public Enemy enemy;
public Ball ball;

public Paint(){
    createEnemys();
}

ActionListener taskPerformer = new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
        Iterator<Enemy> it = al2.iterator();
        while (it.hasNext()) {
            Enemy enemy = it.next();
            if (enemy.x == 520)
            {
                enemy.x = -120;
            }
            enemy.x +=1;
            repaint();
        }
    }
};
Timer t2 = new Timer(5,taskPerformer);

public void actionPerformed(ActionEvent arg0) {
    Iterator<Ball> it = al.iterator();
    while (it.hasNext()) {
        Ball ball = it.next();
        if (ball.y < -10) {
            it.remove();
            System.out.println(enemy.getX());
        } else {
            ball.y += vely;
            repaint();
        }
    }
}

public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(Color.gray);
    g.fillRect(0, 0, 500, 500);
    for(Ball ball : this.al) {
        g.setColor(Color.RED);
        g.fillOval(ball.x,ball.y,10,10);
        t.start();
    }
    for(Enemy enemy : this.al2) {
        g.setColor(new Color(c));
        g.fillRect(enemy.x,enemy.y,enemy.h,enemy.w);
        t2.start();
    }
    g.setColor(new Color(color));
    g.fillRect(x, y, 70, 10);
}



public void move(){
    x += velx;
    if (x <= 3)
    {
        x = 3;
    }
    if (x >= 420)
    {
        x = 420;
    }
}

public void createEnemys(){
    al2.add(new Enemy(-60,10,60,10));
    al2.add(new Enemy(20,10,60,10));
    al2.add(new Enemy(100,10,60,10));
    al2.add(new Enemy(180,10,60,10));
    al2.add(new Enemy(260,10,60,10));
    al2.add(new Enemy(340,10,60,10));
    al2.add(new Enemy(420,10,60,10));
    al2.add(new Enemy(500,10,60,10));

    al2.add(new Enemy(-60,30,60,10));
    al2.add(new Enemy(20,30,60,10));
    al2.add(new Enemy(100,30,60,10));
    al2.add(new Enemy(180,30,60,10));
    al2.add(new Enemy(260,30,60,10));
    al2.add(new Enemy(340,30,60,10));
    al2.add(new Enemy(420,30,60,10));
    al2.add(new Enemy(500,30,60,10));

    al2.add(new Enemy(-60,50,60,10));
    al2.add(new Enemy(20,50,60,10));
    al2.add(new Enemy(100,50,60,10));
    al2.add(new Enemy(180,50,60,10));
    al2.add(new Enemy(260,50,60,10));
    al2.add(new Enemy(340,50,60,10));
    al2.add(new Enemy(420,50,60,10));
    al2.add(new Enemy(500,50,60,10));

    al2.add(new Enemy(-60,70,60,10));
    al2.add(new Enemy(20,70,60,10));
    al2.add(new Enemy(100,70,60,10));
    al2.add(new Enemy(180,70,60,10));
    al2.add(new Enemy(260,70,60,10));
    al2.add(new Enemy(340,70,60,10));
    al2.add(new Enemy(420,70,60,10));
    al2.add(new Enemy(500,70,60,10));
}

}
最后是敌人:

import javax.swing.JPanel;

public class Enemy extends JPanel{
public int x,y,h,w;
public Enemy(int x, int y,int h,int w) {
    this.x = x;
    this.y = y;
    this.h = h;
    this.w = w;
}
public int getX() {
    return x;
}
public int getY() {
    return y;
}
}

问题出在课堂
Paint
中,我无法检查球与敌人的碰撞情况,以便将它们清除。如果有人可以帮助我,谢谢

假设您使用
Java8
,可以使用
流API
和删除所有匹配元素的方法来完成:

al.removeAll(
    al.stream().filter(
        ball -> {
            List<Enemy> enemies = al2.stream()
                .filter(enemy -> ball.x == enemy.x && ball.y == enemy.y)
                .collect(Collectors.toList());
            al2.removeAll(enemies);
            return !enemies.isEmpty();
        }
    ).collect(Collectors.toList())
);

你在哪里比较这些值?为什么
敌人
扩展
JPanel
?你做了什么调试?我不知道我是否把它放在正确的地方,但在课堂画图中我做了第二个计时器,所以我把这两个代码放在那里,但只是有时它们会消失(我也分别测试了代码)。我不知道这是不是我的错,但对我来说,这两种方式都不行。可能是因为你在问题描述中所问的不是你需要的。我的意思是你说“我想当一个球的x和y坐标等于一个敌人的x和y坐标时,它们都被移除”,如果你的算法是检测碰撞,那么它真的很弱,因为你有一个圆形的球和一个矩形的敌人,所以要发生碰撞,球的中心必须与敌人的左上角完全匹配,这是非常罕见的,这就是为什么它不起作用。algo根本不正确,你需要一个更精确的algo来检测一个圆和一个矩形之间的碰撞,如果我把球变成矩形怎么办?一般来说,出于性能原因,实际上是这样做的,即使物体是一个圆,用于检测碰撞的区域是一个2*半径边长的正方形。但您仍然需要检查这些形状是否相互相交,这只能通过基于不等式而非等式的测试来完成。这将有助于您简单地使用矩形#相交(矩形r)而不是测试球。x==敌方.x&&ball.y==敌方.y
import javax.swing.JPanel;

public class Enemy extends JPanel{
public int x,y,h,w;
public Enemy(int x, int y,int h,int w) {
    this.x = x;
    this.y = y;
    this.h = h;
    this.w = w;
}
public int getX() {
    return x;
}
public int getY() {
    return y;
}
}
al.removeAll(
    al.stream().filter(
        ball -> {
            List<Enemy> enemies = al2.stream()
                .filter(enemy -> ball.x == enemy.x && ball.y == enemy.y)
                .collect(Collectors.toList());
            al2.removeAll(enemies);
            return !enemies.isEmpty();
        }
    ).collect(Collectors.toList())
);
main: for (Iterator<Ball> itBall = al.iterator(); itBall.hasNext();) {
    Ball ball = itBall.next();
    for (Iterator<Enemy> itEnemy = al2.iterator(); itEnemy.hasNext();) {
        Enemy enemy = itEnemy.next();
        if (ball.x == enemy.x && ball.y == enemy.y) {
            itBall.remove();
            itEnemy.remove();
            continue main;
        }
    }
}