我想创建一个球对象的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;
}
}
}
1条答案
按热度按时间bq8i3lrv1#
把你的问题分解成更小更简单的步骤。
例如
当你点击一个球,它就会被移除。在同一个位置上,应该出现两个球,球的方向不同。
单击球时:可以将dist()函数(用于检查鼠标与球之间的距离是否小于半径)与mouseclicked()混合使用(或
mousePressed()
/mouseReleased()
)它被删除了:你已经打过电话了
balls.add()
. 同样,你也可以打电话balls.remove()
传递要删除的球对象或索引(视情况而定)相同位置:您需要记住(存储坐标)被单击以在相同位置添加两个球的球
不同的方向:你已经这样做了
Ball()
构造函数:可以对每个新球应用相同的逻辑。这里有一个基本的草图来说明第1点,使用
dist()
:粘贴到一个新的草图,运行它,你应该得到使用的窍门
dist()
就你的问题而言。关于第2点、第3点、第4点,这里是你的草图的一个修改版本,带有注解和一个稍微不同的方法:与其移除一个球以在不同方向的确切位置添加一个新球,不如随机化方向。从视觉上看,它将看起来像一个新的球(除了随机大小/颜色)。重复使用单击的球时,只添加第二个球:
这个
copy()
这个方法非常灵活,如果绝对必要的话,很容易去掉一个球再加上两个球。例如: