在我的代码中,我有一个类Key
,可以在随机坐标处创建一个键。按下键后,该键将添加到ArrayList
中。 ArrayList
在draw()
方法中进行迭代,并且密钥以一定的速度下降。可以一次显示多个键。一旦离开屏幕视图,我想从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);
}
}
答案 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的教程,包括我刚才概述的方法。