Processing 加速出球屏幕(处理2.1)

Processing 加速出球屏幕(处理2.1),processing,Processing,这应该是一个气球上升,当窗口结束时停止。我不明白为什么我的球最终消失了。。。谁来帮帮我。。。。当我尝试调整重力参数或加速度参数时,它要么开始疯狂地快速移动(并消失),要么非常缓慢(最终也消失)。我定义了checkEdges()方法,这样就不会发生这种情况。显然有些事情不对 Mover; 无效设置(){ 规模(300600); 背景(255); 移动器=新移动器(); } 作废提款(){ 背景(255,50); mover.applyForceWind(); mover.applyForceGra

这应该是一个气球上升,当窗口结束时停止。我不明白为什么我的球最终消失了。。。谁来帮帮我。。。。当我尝试调整重力参数或加速度参数时,它要么开始疯狂地快速移动(并消失),要么非常缓慢(最终也消失)。我定义了checkEdges()方法,这样就不会发生这种情况。显然有些事情不对

Mover;
无效设置(){
规模(300600);
背景(255);
移动器=新移动器();
}
作废提款(){
背景(255,50);
mover.applyForceWind();
mover.applyForceGravity();
mover.update();
mover.display();
mover.checkEdges();
}
班级搬运工{
PVector定位;
PVector速度;
PVector加速度;
PVector重力;
PVector风;
搬运工(){
位置=新的PVector(宽度/2,高度*0.9);
速度=新的PVector(0,0);
加速度=新PVector(0,-1);
}
无效应用程序forcewind(){
PVector风=新PVector(0.001,0);
加速度。添加(风);
}
无效应用程序强制集成(){
PVector重力=新PVector(0,0.1);
加速度。加(重力);
}
无效更新(){
速度加(加速度);
位置。添加(速度);
加速度mult(0);
}
无效显示(){
冲程(0);
填充(155);
椭圆(位置x,位置y,30,30);
}
void checkEdges(){
如果(location.x>width | | location.x<0){velocity.x*=(-1)}
如果(location.y>height | | location.y<0){velocity.y*=(-1)}
}
}

伙计,加速度是恒定的,但每次迭代都会增加加速度….

代码中有一个额外的大括号,仅供参考。球最终“卡”在地板上并消失的问题是由于您怀疑您的
checkEdges()
code。要了解这个问题,请尝试以下代码:

void checkEdges(){
如果(location.x>width | | location.x<0){velocity.x*=(-1)}
如果(location.y>height | | location.y<0){
速度y*=(-1);
println(“速度:+velocity.y+”,位置:+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>600,所以将y速度乘以负1。在下一次迭代中,它向上移动了2个单位,所以y现在是600.1,但这仍然在屏幕上,所以它再次反转速度!下面是一张(粗略的)图片来说明这个想法:

红线表示速度反转后的迭代。随着时间的推移,每条红线的长度都会减少(球反弹的高度不会太高),最终它不会回到障碍物上方!在这一点上,它仍然在屏幕底部以下,因此反演测试仍然通过,因此它将正速度变成负速度,而它仍然在屏幕底部以下

有几种方法可以解决此问题:

  • 防止球随着时间的推移而失去能量。这可能很棘手。这里有一条线索:如果在
    update()
    函数中交换这两行的顺序,球将随着时间的推移获得能量!一个有趣的结果

    location.add(速度)

    velocity.add(加速度)

  • 无论如何,让球飞到窗口边缘以下是没有意义的,因此如果球在那里,则将其强制返回到窗口边缘,即将其插入
    checkEdges()
    方法:

    location.y=高度

当我使用第二颗子弹时,我会得到一个恒定的弹跳响应,并且随着时间的推移,不会损失速度:

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

另外,还有一个旁注:每次调用这些方法时,无需创建新的
重力
PVectors。事实上,您甚至将它们声明为类变量!在构造函数中设置它们的值,然后可以在其他方法中使用它们

每次调用
update()
,他都会将加速度归零。