Java 如何在发生冲突时从arrayList中删除项?

Java 如何在发生冲突时从arrayList中删除项?,java,arraylist,processing,collision-detection,bullet,Java,Arraylist,Processing,Collision Detection,Bullet,试图复制游戏坦克的麻烦,我不知道如何用子弹和墙壁/玩家进行碰撞检测。这些子弹是在按下鼠标时产生的,但我不知道如何使它们在击中物体后消失 试图让他们融入背景接触,但游戏开始落后努力。我还尝试了人们用来从ArrayList中删除项的反向循环方法,但没有成功 PVector player = new PVector (300, 400); ArrayList <Bullet> bullets = new ArrayList <Bullet> (); float maxSpeed

试图复制游戏坦克的麻烦,我不知道如何用子弹和墙壁/玩家进行碰撞检测。这些子弹是在按下鼠标时产生的,但我不知道如何使它们在击中物体后消失

试图让他们融入背景接触,但游戏开始落后努力。我还尝试了人们用来从ArrayList中删除项的反向循环方法,但没有成功

PVector player = new PVector (300, 400);
ArrayList <Bullet> bullets = new ArrayList <Bullet> ();
float maxSpeed = 3; //speed of bullets

void setup() {
   size(800, 600);
   fill(0);
}

void draw() {
  background(255);
  line(20, 200, 400, 200);
  rect(300, 400, 50, 50);

  //creates an aiming tool for the players
  PVector mouse = new PVector(mouseX, mouseY);
  fill(255);
  ellipse(mouse.x, mouse.y, 8, 8);

  if (frameCount%5==0 && mousePressed) {
     PVector dir = PVector.sub(mouse, player);
     dir.normalize();
     dir.mult(maxSpeed*3);
     Bullet b = new Bullet(player, dir);
     bullets.add(b);
  }

  for (Bullet b : bullets) {
     b.update();
     b.display();
  }
}

class Bullet extends PVector {
  PVector vel;

  Bullet(PVector loc, PVector vel) {
    super(loc.x, loc.y);
    this.vel = vel.get();
  }

  void update() {
    add(vel);
  }

  void display() {
    fill(0);
    ellipse(x, y, 5, 5);
  }

  float bulletX() {
    return x;
  }
}
PVector玩家=新的PVector(300400);
ArrayList项目符号=新的ArrayList();
浮点最大速度=3//子弹的速度
无效设置(){
尺寸(800600);
填充(0);
}
作废提款(){
背景(255);
行(20、200、400、200);
rect(300、400、50、50);
//为玩家创建瞄准工具
PVector鼠标=新的PVector(mouseX,mouseY);
填充(255);
椭圆(mouse.x,mouse.y,8,8);
if(帧数%5==0&&mousePressed){
PVector dir=PVector.sub(鼠标,玩家);
dir.normalize();
多方向(最大速度*3);
子弹b=新子弹(玩家,方向);
项目符号.添加(b);
}
用于(项目符号b:项目符号){
b、 更新();
b、 显示();
}
}
类Bullet扩展了PVector{
PVector-vel;
项目符号(PVector loc,PVector vel){
超级(位置x、位置y);
this.vel=vel.get();
}
无效更新(){
添加(vel);
}
无效显示(){
填充(0);
椭圆(x,y,5,5);
}
浮动bulletX(){
返回x;
}
}

基本上希望子弹在最后一次触杀前反弹3-4次。如果它在任何一点接触到玩家,他们都应该被释放。

将方法添加到类
Bullet
,该类将验证一个Bullet是否在窗口外:

class项目符号扩展了PVector{
// [...]
布尔出边界(){
返回this.xwidth | | this.yheight;
}
}
在类中添加一行冲突检查
Bullet
。要检查子弹是否击中留置线,您必须计算线上最近的点,并验证到线的距离是否小于子弹的速度,以及子弹是否未错过其侧面的线

如果你有一条线,由一个点(
O
)和一个方向(
D
)给出,那么线上距离点p最近的点可以计算如下

X = O + D * dot(P-O, D);

两个矢量的点积等于两个矢量之间的夹角的余弦乘以两个矢量的大小(长度)

V
D
的点积等于直线(
O
D
)和向量
V=p-O
)之间的夹角的余弦乘以
V
的量(长度),因为
D
是a(
D
的长度是1.0)

将此应用于代码,将导致以下方法:

class项目符号扩展了PVector{
// [...]
布尔碰撞线(浮点x1、浮点y1、浮点x2、浮点y2){
PVector O=新的PVector(x1,y1);
PVector L2=新PVector(x2,y2);
浮动长度=O.dist(L2);
PVector D=L2.sub(O).normalize();
PVector P=此;
PVector X=加法(O,mult(D,sub(P,O).dot(D));
//到线路的距离必须小于速度
浮动距离X=X.dist(P);
如果(distX>this.vel.mag())
返回false;
//如果子弹没有“漏掉”那就太好了
PVector VX=X.sub(O);
浮动距离=VX.点(D);
返回distO>-5&&distO
如果项目符号超出范围或与行冲突,则按其索引(按相反顺序)从列表中删除项目符号:

void draw(){
// [...]
对于(int j=bullets.size()-1;j>=0;j--){
if(bullets.get(j).outOfBounds()| | bullets.get(j).collide(20200400200))
删除(j);
}
}

请查看下面的链接,也欢迎访问SO。您是否对碰撞检测或从列表中删除项目存在问题?非常感谢!这并没有完全回答我关于反弹的第二个问题,但这是一个很好的起点。你的图表对理解有很大帮助。我将对此进行调整,并将其实现到我的代码中。不过,你能解释一下这句话的意思吗?我不想盲目地复制粘贴它而不了解它的功能?如果(distX>this.vel.mag())@J.Doe
distX
列出从项目符号到线条的最短距离
this.vel.mag()
是速度向量的长度,是每帧子弹向前移动的距离。“这并没有完全回答我的第二个问题”-这个问题非常广泛,可能从远到宽。也许我会回答,如果我在日记里找到时间的话。
dot( A, B ) == | A | * | B | * cos( alpha )