加速球离开屏幕(处理2.1)

时间:2014-03-03 18:27:35

标签: processing

它应该是一个气球上升,当窗口结束时停止。我无法理解为什么我的球最终会消失......有人帮我....当我尝试调整重力参数或加速度时,它要么开始疯狂快速(和消失),要么真正慢(最终消失) 。我有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);}
   }
 }

2 个答案:

答案 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,但是仍然在屏幕外,因此它再次反转速度!这是一张(原始)图片来说明这个想法:

Bouncing Problem

红线代表速度反转后的迭代。每条红线的长度随着时间的推移而减少(球不会反弹得那么高),最终它实际上并没有回到障碍物之上!此时,它仍然低于屏幕底部,因此反转测试仍然通过,因此它将正速度变为负值,同时它仍低于屏幕底部

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

  • 随着时间的推移,防止球失去能量。这可能很棘手。这里有一个线索:如果你在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)

老兄,加速度是恒定的,但你每次迭代都会加入......