在下面的代码中,我希望一旦球的年龄高于阈值,球就会从ArrayList ballList
更改为另一个ArrayList oldBalls
。
这段代码应该非常简单但是我无法弄清楚为什么当年龄与阈值(不大)相同时它们会消失,然后它们会在2帧之后再回来。
我已经使用java中的ArrayLists的迭代器检查了相关问题,但我认为应该有一种方法可以在没有java的情况下进行处理。 此外,我似乎无法在处理论坛上发布任何问题,即使我可以登录,不知道为什么......
我已将代码减少到能够重现错误的最低限度。
ArrayList <Ball> ballList;
ArrayList <Ball> oldBalls;
int threshold=4;
PFont font;
void setup(){
size(400,400);
frameRate(0.5);
font=createFont("Georgia", 18);
textFont(font);
textAlign(CENTER, CENTER);
ballList=new ArrayList<Ball>();
oldBalls=new ArrayList<Ball>();
noFill();
strokeWeight(2);
}
void draw(){
background(0);
Ball b=new Ball(new PVector(10, random(height/10,9*height/10)),new PVector(10,0),0);
ballList.add(b);
stroke(0,0,200);
for(int i=0;i<oldBalls.size();i++){
Ball bb=oldBalls.get(i);
bb.update();
bb.render();
text(bb.age,bb.pos.x,bb.pos.y);
}
stroke(200,0,0);
for(int i=0;i<ballList.size();i++){
Ball bb=ballList.get(i);
bb.update();
bb.render();
bb.migrate();
text(bb.age,bb.pos.x,bb.pos.y);
}
}
class Ball{
PVector pos;
PVector vel;
int age;
Ball(PVector _pos, PVector _vel, int _age){
pos=_pos;
vel=_vel;
age=_age;
}
void migrate(){
if(age>threshold){
oldBalls.add(this);
ballList.remove(this);
}
}
void update(){
pos.add(vel);
age+=1;
}
void render(){
ellipse(pos.x,pos.y,24,24);
}
}
请注意标有age = threshold的球突然消失......
答案 0 :(得分:3)
我猜问题就在这里:
for(int i=0;i<ballList.size();i++){
Ball bb=ballList.get(i);
bb.update();
bb.render();
//add this
if(bb.migrate())
i--;
text(bb.age,bb.pos.x,bb.pos.y);
}
和
boolean migrate(){
if(age>threshold){
oldBalls.add(this);
ballList.remove(this);
//and this
return true;
}
return false;
}
migrate()
将从ballList中删除该对象,并将其大小减小1.
答案 1 :(得分:1)
这里发生的事情是因为你在迭代它们时改变了List。考虑一下你在这里的循环
for(int i=0;i<ballList.size();i++){
Ball bb=ballList.get(i);
bb.update();
bb.render();
bb.migrate();
text(bb.age,bb.pos.x,bb.pos.y);
}
假设ballList在3岁时都有2个球,第一个循环得到球[0]然后将其从列表中移除,我将递增并且循环将立即退出,因为ballList.size()现在是1.所以它不是4岁时消失的球,而是随后的球。