处理 3 - 显示 ArrayList 中的对象

Processing 3 - Displaying objects from ArrayList

我想用鼠标左键创建对象,然后用鼠标右键单击一个一个地删除它们。我可以通过查看较早的问题来解决我以前关于添加、存储和删除对象的问题,但我希望对象准确地出现在用户单击的位置,但我找不到用正确的坐标显示每个对象的解决方案。目前,第一个对象显示在 (0, 0) 处,我什至看不到其余对象,但我可以从控制台看到对象已成功创建。这是我的代码:

ArrayList dots;

void setup() {
 size(500, 500);
 background(255);
 dots = new ArrayList();
 colorMode(HSB);
 strokeWeight(2);
}

void mousePressed() {
 if(mouseButton==LEFT) {
   dots.add(new Dot(mouseX, mouseY));
   Dot temp1 = (Dot)dots.get(dots.size()-1);
   temp1.create(dotX, dotY);
 }
 if(mouseButton==RIGHT && dots.size()>0) {
   dots.remove(dots.size()-1);
 }
}

void draw() {
  background(255);
  for (int i = 0; i < dots.size(); i++) {
    Dot temp2 = (Dot)dots.get(i);
    temp2.display(coord[0], coord[1]);
  }
  println("Object count: " + dots.size());
}

int dotX;
int dotY;
int[] coord = {dotX, dotY};

class Dot{
  int id;
  Dot(int dotX, int dotY) {
    id = dots.size();
    dotX = mouseX;
    dotY = mouseY;
  }

  int[] create(int dotX, int dotY) {
    int[] coord = {dotX, dotY};
    display(dotX, dotY);
    return coord;
  }

  void display(int dotX, int dotY) {
    float c1 = map(dotX, 0, width, 0, 255);
    noStroke();
    fill(c1, 255, 255);
    ellipse(dotX, dotY, 20, 20);
  }
}

我创建了 create() return 一个数组,否则我在显示它时似乎无法引用每个对象的坐标,但我认为主要问题在于它。建议?

您的主要问题是由 class 级别的 dotXdotYcoord 变量引起的。这意味着您的所有 Dot 个实例都共享相同的位置。摆脱那些变量。

相反,您需要在 Dot class 中使用变量 ,这样每个 Dot 都可以有自己的位置。

然后你有一堆额外的垃圾需要清除。您的 create() 函数似乎没有做任何有用的事情,并且您的 display() 函数不需要任何参数,因为您已经在 Dot class 你应该改用它。

把它们放在一起,看起来像这样:

ArrayList<Dot>  dots = new ArrayList<Dot>();

void setup() {
 size(500, 500);
 background(255);
}

void mousePressed() {
 if(mouseButton==LEFT) {
   dots.add(new Dot(mouseX, mouseY));

 }
 if(mouseButton==RIGHT && dots.size()>0) {
   dots.remove(dots.size()-1);
 }
}

void draw() {
  background(255);
  for(Dot dot : dots){
    dot.display();
  }
}



class Dot{

  float dotX;
  float dotY;

  int id;
  Dot(int dotX, int dotY) {
    id = dots.size();
    this.dotX = dotX;
    this.dotY = dotY;
  }

  void display() {
    float c1 = map(dotX, 0, width, 0, 255);
    noStroke();
    fill(c1, 255, 255);
    ellipse(dotX, dotY, 20, 20);
  }
}

另请注意,我向您的 ArrayList 添加了泛型。

而不是这个:

ArrayList dots = new ArrayList();

这样做:

ArrayList 点 = new ArrayList();

<Dot> 部分告诉 Processing 您的 ArrayList 将持有什么类型的对象,因此您不再需要强制转换,并且可以使用增强的 for 循环。