2017-02-28 68 views
4

我一直试图弄清楚现在几个小时无济于事。这是非常简单的代码,一个弹跳球(粒子)。将粒子的速度初始化为(0,0)将保持它上下跳动。颗粒的初始化速度更改为(0,0.01)或任何十进制浮点将导致球降低用float处理奇怪的问题

Particle p; 

void setup() { 
    size(500, 600); 
    background(0); 
    p = new Particle(width/2, height/2); 

} 

void draw() { 
    background(0, 10); 
    p.applyForce(new PVector(0.0, 1.0)); // gravity 
    p.update(); 
    p.checkBoundaries(); 
    p.display(); 

} 

class Particle { 
    PVector pos, vel, acc; 
    int dia; 

    Particle(float x, float y) { 
    pos = new PVector(x, y); 
    vel = new PVector(0.0, 0.0); 
    acc = new PVector(0.0, 0.0); 
    dia = 30; 
    } 

    void applyForce(PVector force) { 
    acc.add(force); 
    } 

    void update() { 
    vel.add(acc); 
    pos.add(vel); 
    acc.mult(0); 
    } 

    void display() { 
     ellipse(pos.x, pos.y, dia, dia); 
    } 

    void checkBoundaries() { 
    if (pos.x > width) { 
     pos.x = width; 
     vel.x *= -1; 
    } else if (pos.x < 0) { 
     vel.x *= -1; 
     pos.x = 0; 
    } 
    if (pos.y > height) { 
     vel.y *= -1; 
     pos.y = height; 
    } 
    } 
} 

回答

5

我不是在处理矢量的专家,但我相信我已想出为什么这是发生。如果尝试用速度向量的y部分的不同值重新创建此问题,则会发现只有当值不是.5的倍数时才会发生此问题。在此基础上,该行很可能是负责:

if (pos.y > height) { 
    vel.y *= -1; 
    pos.y = height; 
} 

此行轮球的高度,并逆转了它的速度。这个效果很好,当球刚好击中0并且在球回来之前获得额外的速度,但是当球稍微低于它应该的时候,来自额外迭代的速度不会被添加。正如它发生的那样,.5的倍数恰好为0,但其他值不会。我的证据是,当你改变问题的代码为以下,每个值导致球掉在地上,最终:

if (pos.y >= height) { 
    vel.y *= -1; 
    pos.y = height; 
} 

总之,舍入,而不是让球反弹时,命中0原因这个问题。我希望这能回答你的问题。