处理 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 级别的 dotX
、dotY
和 coord
变量引起的。这意味着您的所有 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 循环。
我想用鼠标左键创建对象,然后用鼠标右键单击一个一个地删除它们。我可以通过查看较早的问题来解决我以前关于添加、存储和删除对象的问题,但我希望对象准确地出现在用户单击的位置,但我找不到用正确的坐标显示每个对象的解决方案。目前,第一个对象显示在 (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 级别的 dotX
、dotY
和 coord
变量引起的。这意味着您的所有 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 循环。