它应该是一个气球上升,当窗口结束时停止。我无法理解为什么我的球最终会消失......有人帮我....当我尝试调整重力参数或加速度时,它要么开始疯狂快速(和消失),要么真正慢(最终消失) 。我有checkEdges()方法,这样就不会发生这种情况。显然有些事情是不对的
Mover mover;
void setup(){
size(300,600);
background(255);
mover = new Mover();
}
void draw(){
background(255,50);
mover.applyForceWind();
mover.applyForceGravity();
mover.update();
mover.display();
mover.checkEdges();
}
class Mover {
PVector location;
PVector velocity;
PVector acceleration;
PVector gravity;
PVector wind;
Mover(){
location = new PVector(width/2,height*0.9);
velocity = new PVector(0,0);
acceleration = new PVector(0,-1);
}
void applyForceWind(){
PVector wind = new PVector(0.001,0);
acceleration.add(wind);
}
void applyForceGravity(){
PVector gravity = new PVector(0,0.1);
acceleration.add(gravity);
}
void update(){
velocity.add(acceleration);
location.add(velocity);
acceleration.mult(0);
}
void display(){
stroke(0);
fill(155);
ellipse(location.x,location.y,30,30);
}
void checkEdges(){
if ( location.x > width || location.x < 0){ velocity.x *= (-1);}
if ( location.y > height || location.y < 0){ velocity.y *=(-1);}
}
}
答案 0 :(得分:2)
你的代码中有一个额外的大括号,只是FYI。球的问题最终会被“卡住”在地板上并消失,这是由于您怀疑的checkEdges()
代码。要了解这个问题,请尝试以下代码:
void checkEdges(){
if ( location.x > width || location.x < 0){ velocity.x *= (-1);}
if ( location.y > height || location.y < 0){
velocity.y *=(-1);
println("velocity: " + velocity.y + "; position: " + location.y);
}
}
它会给出类似的东西:
...
velocity: -2.3999999; position: 602.1
velocity: -2.3; position: 602.1
velocity: -2.2; position: 602.1
velocity: -2.1000001; position: 602.1
velocity: 2.0000002; position: 600.1
velocity: -2.1000001; position: 602.19995
velocity: 2.0000002; position: 600.19995
velocity: -2.1000001; position: 602.2999
velocity: 2.0000002; position: 600.2999
...
正如您所看到的,每次连续“反弹”时的y速度略低于之前的速度,这意味着您的系统正在消耗能量。特别是,当速度变得太低而无法使其回到屏幕底部以上时(它低于2.1,它必须返回多远),它开始表现不正常。想象一下它会持续一段时间,然后下次它必须反弹时,它的y速度只有-2。它在y = 602.1&gt; 600,所以将y速度乘以负数。在下一次迭代中,它向上移动2个单位,因此y现在是600.1,但是仍然在屏幕外,因此它再次反转速度!这是一张(原始)图片来说明这个想法:
红线代表速度反转后的迭代。每条红线的长度随着时间的推移而减少(球不会反弹得那么高),最终它实际上并没有回到障碍物之上!此时,它仍然低于屏幕底部,因此反转测试仍然通过,因此它将正速度变为负值,同时它仍低于屏幕底部。
有几种方法可以解决这个问题:
随着时间的推移,防止球失去能量。这可能很棘手。这里有一个线索:如果你在update()
函数中交换这两行的顺序,随着时间的推移,球会获得能量!一个有趣的结果。
location.add(velocity);
velocity.add(acceleration);
允许球无论如何都要低于窗户的边缘是没有意义的,所以如果它在那里,那么强迫它回到边缘,即将其插入你的{{1}方法:
checkEdges()
当我使用第二颗子弹时,我会得到一个恒定的反弹响应,并且随着时间的推移没有速度损失:
location.y = height;
另外,附注:每次调用方法时都不需要创建新的velocity: -3.5999987; position: 600.0
velocity: -3.5999987; position: 600.0
velocity: -3.5999987; position: 600.0
velocity: -3.5999987; position: 600.0
velocity: -3.5999987; position: 600.0
velocity: -3.5999987; position: 600.0
和wind
PVectors。实际上,你甚至将它们声明为类变量!在构造函数中设置它们的值,然后您可以在其他方法中使用它们。
答案 1 :(得分:0)
老兄,加速度是恒定的,但你每次迭代都会加入......