处理-将hittest和mousepressed添加到带有100个球的动画中

eblbsuwk  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(280)

我想创建一个球对象的arraylist,它应该在一个循环中,直到有100个球为止。
现在我的问题是:我必须实现一个函数 hitTest ,这样当你点击一个球时它就会被移除。在同一个位置上,应该出现两个球,球的方向不同。
有人能帮我吗?我太迷路了。。。
以下是我目前的代码:

Ball b; 
ArrayList<Ball> balls;

void setup() { 
  size(800, 800); 
  balls = new ArrayList<Ball>(); 
  for (int i = 0; i<100; i++) { 
    drawBall();
  }
}

void draw() { 
  background(255); 
  //b.update(); 
  for (int i= 0; i<balls.size(); i++) { 
    balls.get(i).update();
  }
}

void drawBall() { 
  Ball b = new Ball(); 
  balls.add(b);
}

class Ball { 
  private float x; 
  private float y; 
  private float ballSize; 
  private float dirX; 
  private float dirY; 
  private boolean moving = true; 
  Ball() { 
    this.x = width/2; 
    this.y = height/2; 
    this.ballSize = random(10.0, 30.0); 
    this.dirX = random(-3.0, 3.0); 
    this.dirY = random(-3.0, 3.0); 
    if (this.dirX<1.0 && this.dirX>1.0)  //1 statt -1 macht zufälliger { this.dirX = 1.0; } 
      if (this.dirY<1.0 && this.dirY>1.0) { 
        this.dirY = 1.0;
      }
  }

  public void update() { 
    stroke(255); 
    fill(random(255), random(255), random(255), random(255)); 
    ellipse( this.x, this.y, this.ballSize, this.ballSize); 
    if (this.moving == true) { 
      this.x += this.dirX; 
      this.y += this.dirY;
    } 
    if (this.x+ this.ballSize/2> width ||this.x- this.ballSize/2<0) { 
      this.dirX= dirX*-1;
    } 
    if (this.y+ this.ballSize/2> height ||this.y- this.ballSize/2<0) { 
      this.dirY= dirY*-1;
    }
  }
}
bq8i3lrv

bq8i3lrv1#

把你的问题分解成更小更简单的步骤。
例如
当你点击一个球,它就会被移除。在同一个位置上,应该出现两个球,球的方向不同。
单击球时:可以将dist()函数(用于检查鼠标与球之间的距离是否小于半径)与mouseclicked()混合使用(或 mousePressed() / mouseReleased() )
它被删除了:你已经打过电话了 balls.add() . 同样,你也可以打电话 balls.remove() 传递要删除的球对象或索引(视情况而定)
相同位置:您需要记住(存储坐标)被单击以在相同位置添加两个球的球
不同的方向:你已经这样做了 Ball() 构造函数:可以对每个新球应用相同的逻辑。
这里有一个基本的草图来说明第1点,使用 dist() :

void draw(){
  background(255);
  int ballX = 50;
  int ballY = 50;
  int ballRadius = 35;

  if(dist(ballX, ballY, mouseX, mouseY) < ballRadius){
    fill(0,192,0);
  }else{
    fill(192,0,0);
  }

  ellipse(ballX,ballY, ballRadius * 2, ballRadius * 2);
}

粘贴到一个新的草图,运行它,你应该得到使用的窍门 dist() 就你的问题而言。
关于第2点、第3点、第4点,这里是你的草图的一个修改版本,带有注解和一个稍微不同的方法:与其移除一个球以在不同方向的确切位置添加一个新球,不如随机化方向。从视觉上看,它将看起来像一个新的球(除了随机大小/颜色)。重复使用单击的球时,只添加第二个球:

Ball b; 
ArrayList<Ball> balls;

void setup() { 
  size(800, 800); 
  balls = new ArrayList<Ball>(); 
  for (int i = 0; i<100; i++) { 
    drawBall();
  }
}

void draw() { 
  background(255); 
  //b.update(); 
  for (int i= 0; i<balls.size(); i++) {
    // pass the mouse coordinates to each ball to check if it's hovered or not
    balls.get(i).update(mouseX, mouseY);
  }
}

// on mouse pressed
void mousePressed(){
  for (int i= 0; i<balls.size(); i++) {
    // make current ball reusable in this loop
    Ball ball = balls.get(i); 
    // if ball is hovered
    if(ball.isHovered){
      // randomize direction of current ball
      ball.setRandomDirection();
      // add a new ball from the current location
      balls.add(ball.copy());
    }
  }
}

void drawBall() { 
  Ball b = new Ball(); 
  balls.add(b);
}

class Ball { 

  private float x; 
  private float y; 
  private float ballSize; 
  private float dirX; 
  private float dirY; 
  private boolean moving = true;
  private color fillColor;
  // property to keep track if the ball is hovered or not
  private boolean isHovered;

  Ball() { 
    this.x = width/2; 
    this.y = height/2; 
    this.ballSize = random(10.0, 30.0); 
    this.setRandomDirection();
    this.fillColor = color(random(255), random(255), random(255), random(255));
  }
  // extract random direction calls into a re-usable function (handy for click / collision)
  void setRandomDirection(){
    this.dirX = random(-3.0, 3.0); 
    this.dirY = random(-3.0, 3.0); 
    if (this.dirX<1.0 && this.dirX>1.0) { //1 statt -1 macht zufälliger { this.dirX = 1.0; } 
      if (this.dirY<1.0 && this.dirY>1.0) { 
        this.dirY = 1.0;
      }
    }
  }

  public void update(int x, int y) {
    // euclidean distance between this ball's coordinates a given x y position (e.g. mouse)
    isHovered = dist(this.x, this.y, x, y) < this.ballSize / 2;
    // optional: use stroke color to visually display highlighted ball
    if(isHovered){
      stroke(0);
    }else{
      stroke(255);
    }

    fill(fillColor); 
    ellipse( this.x, this.y, this.ballSize, this.ballSize); 
    if (this.moving == true) { 
      this.x += this.dirX; 
      this.y += this.dirY;
    } 
    if (this.x + this.ballSize / 2 > width ||
        this.x - this.ballSize / 2 < 0) { 
      this.dirX= dirX*-1;
    } 
    if (this.y + this.ballSize / 2 > height ||
        this.y - this.ballSize / 2 < 0) { 
      this.dirY= dirY*-1;
    }
  }
  // utility function: simply copies this ball's x,y position to the new one
  Ball copy(){
    Ball clone = new Ball();
    clone.x = this.x;
    clone.y = this.y;
    return clone;
  }
}

这个 copy() 这个方法非常灵活,如果绝对必要的话,很容易去掉一个球再加上两个球。例如:

// on mouse pressed
void mousePressed(){
  for (int i= 0; i<balls.size(); i++) {
    // make current ball reusable in this loop
    Ball ball = balls.get(i); 
    // if ball is hovered
    if(ball.isHovered){
      // add two new balls from the current location
      balls.add(ball.copy());
      balls.add(ball.copy());
      // remove ball
      balls.remove(i);
    }
  }
}

相关问题