提问者:小点点

鼠标按压和鼠标释放创建对象


我有一个创建一个ball对象的ball类。我想在鼠标按下时创建一个ball对象,如果鼠标按下并按住,球应该跟随鼠标(当鼠标按下时)。当鼠标释放时,球应该停留在当前mouseX和mouseY,不再跟随鼠标。

当再次按下鼠标时,会创建另一个球对象,并与第一个对象执行相同的操作,依此类推…每次按下鼠标都会创建一个新的球对象。

我有一些代码来创建一个对象,它跟随鼠标,当我释放鼠标时,它会放在画布上。但是如果我再次按下鼠标,原始球就会回到鼠标上。我如何“脱离”球对象,这样我就可以制作更多不影响先前放置球的位置的球对象?。

我计划使用ArrayList制作许多对象。

class Ball {
  float xPos, yPos; 


  Ball(float xPos, float yPos) {
    this.xPos= xPos;
    this. yPos= yPos;
  }
  void drawBall() {
    ellipse(xPos, yPos, 50, 50);
    println("X" + xPos + " Y:"+ yPos);
  }

}
Ball ball1;
Ball ball2;
ArrayList<Ball> ballList = new ArrayList<Ball>();

void setup() {
  size(600, 600);
  ball1=new Ball(900, 900);
  ball2=new Ball(900, 900);
}

void draw() {
  
  background(150);
  if (mousePressed ) {
    ball1.xPos= mouseX;
    ball1.yPos=mouseY;
  }

  ball1.drawBall();
}


共1个答案

匿名用户

这里的问题是您根本没有管理数组,而是一直使用相同的对象。我使用arraylist重新编写了您的示例来存储Ball对象,并且在用户单击鼠标按钮时创建新球。

请注意,我故意使用“添加到数组列表的最后一项”,而不是创建一个对象来引用this对象。这是因为我不想用引用之类的东西混淆你。

ArrayList<Ball> ballList = new ArrayList<Ball>();

void setup() {
  size(600, 600);
}

void draw() {  
  background(150);
  
  // if the mouse button is held down, set the ball's coordinates to the mouse coordinates
  if (ballList.size() > 0 && mousePressed) {
    ballList.get(ballList.size() - 1).xPos = mouseX;  // 'ballList.get(ballList.size() - 1)' is the java way to get the last item added to an arrayList
    ballList.get(ballList.size() - 1).yPos = mouseY;
  }
  
  // draw every ball in the array (the weird format is just shorthand for a "for each" loop)
  for(Ball b : ballList) {
    b.drawBall();
  }  
}

// this method will trigger once every time the user press a mouse button
void mousePressed() {
  ballList.add(new Ball(mouseX, mouseY));
}

class Ball {
  float xPos, yPos; 
  
  Ball(float xPos, float yPos) {
    this.xPos= xPos;
    this.yPos= yPos;
  }
  
  void drawBall() {
    ellipse(xPos, yPos, 50, 50);
  }
}

通过瞄准最后创建的球而不是特定的球,您可以确保始终使用正确的对象。此外,请注意我是如何让球对象在循环中绘制自己的。“for each”表单确保无论数组列表中当前有多少个球,它们都会被打印出来。

祝你在这个项目上好运,如果我的答案有什么令人困惑的地方,不要犹豫,联系我,问一些关于它的问题。

玩得开心!