0

我找不到如何提问,所以链接上有一个演示。我很确定这是一个简单的问题,但我似乎找不到原因。

我的问题是:为什么球停止弹跳?是关于乘法或除法中的舍入等...

   void move() {
        PVector v0 = v;
        PVector dv = PVector.mult(a, deltaT);
        v.add(dv);

        PVector d = PVector.add(
            PVector.mult(v0, deltaT),
            PVector.mult(dv, deltaT * 0.5));

        move(d.x, d.y);
    }


    void move(float dx, float dy) {
        p.x += dx;
        p.y += dy;

        if (p.x > width - r) {
            p.x = width - r;
            v.x = -v.x;
        }
        if (p.x < r) {
            p.x = r;
            v.x = -v.x;
        }
        if (p.y > height - r) {
            p.y = height - r;
            v.y = -v.y;
        }
        if (p.y < r) {
            p.y = r;
            v.y = -v.y;
        }
    }
4

2 回答 2

2

这部分代码有问题:

if (p.y > height - r) {
   p.y = height - r;
   v.y = -v.y;
}

想象一下,高度是 600 并且 r 是 10。当球击中底部(py > (600 - 10))时,它会重置为 (600-10)。但是球可能会撞到下面的底部:py 可能高于高度,从而导致您遇到的问题。在这种情况下,正确的代码将是:

if (p.y > height - r) {
   p.y = (p.y - height) + (height - r);
   v.y = -v.y;
}

成为(py - 高度)每次球反弹时你失去的东西。

希望这可以帮助。

于 2013-06-13T14:25:39.707 回答
0

在Ball对象的每个Move中都有一个乘以一个 < 0 的变量。它的 PVector a; 在 setup()中最初获取重力值的 Ball 对象 ( PVector gravity = new PVector(0, 0.0025); )

ball.a = gravity;

然后在每一步

 PVector dv = PVector.mult(a, deltaT);

最终这导致 PVector dv 值为零。

如果你改变

PVector gravity = new PVector(0, 0.0025);

PVector gravity = new PVector(0, 0.025);

你会看到更强烈的重力效应。

于 2013-05-28T08:02:48.177 回答