物体离开屏幕后如何销毁?

时间:2018-08-01 15:30:34

标签: java arraylist processing

在我的代码中,我有一个类Key,可以在随机坐标处创建一个键。按下键后,该键将添加到ArrayList中。 ArrayListdraw()方法中进行迭代,并且密钥以一定的速度下降。可以一次显示多个键。一旦离开屏幕视图,我想从Key中删除ArrayList

我尝试过类似if (key.location.y - textAscent() > height) {keys.remove(key)}之类的操作,要么导致程序停止工作,要么使字母停止移动,但是一旦到达屏幕底部,它就会保留在视图中。有什么建议吗?

编辑:通过停止工作,我的意思是程序冻结了,并且出现此错误:

java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
    at java.util.ArrayList$Itr.next(ArrayList.java:859)
    at FallingLetters.draw(FallingLetters.java:35)
    at processing.core.PApplet.handleDraw(PApplet.java:2426)
    at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557)
    at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:316)

我不知道该怎么办。

PFont f;
ArrayList<Key> keys;

void setup() {
  fullScreen(1);
  f=createFont("Bahnschrift", 300, true);
  textFont(f);
  keys = new ArrayList();
}

void draw() {
  fill(#FF5254);
  rect(0, 0, width, height);

  for (Key k : keys) {
    k.display();
    k.fall();
  }
}


void keyPressed() {
  keys.add(new Key());
}

class Key {
  PVector location, velocity;
  char k;
  color c;

  public Key() {
    this.c = 0;
    this.k=key;
    this.location = new PVector(random(width), random(height));
    this.velocity = new PVector(0, int(random(1, 11)));
  }

  void display() {
    fill(c);
    text(k, location.x, location.y);
  }

  void fall() {
    this.location.add(velocity);
  }
}

1 个答案:

答案 0 :(得分:1)

Luke的答案已经很不错了,但是我喜欢在简单的处理草图中采用的另一种方法是使用基本的for循环并在列表上向后循环。

for(int i = keys.size()-1; i >= 0; i--){
  Key key = keys.get(i);
  key.display();
  key.fall();
}

现在,如果您删除了fall()函数内部的键,则循环将继续正常运行。

无耻的自我推广:here是有关处理中的ArrayList的教程,包括我刚才概述的方法。