让球停下来

时间:2013-09-24 19:11:08

标签: java math user-interface methods gravity

我的程序中有以下方法可以使球持续弹跳。我尝试过修改,但似乎无法让球停在我的GUI底部。我的主要目标是让这些方法模仿你正在弹跳一个真正的球。

private void updateDelta() {
        final int minimumMovement = 5;
        final int maxExtra = 10;
        deltaY = minimumMovement + (int) (Math.random() * maxExtra);
    }

    public void verticalBounce(Container container) {

        // controls vertical ball motion
        if (upDown) {
            y += deltaY;

            if (y >= getHeight()) {
                upDown = false;
                updateDelta();
            }
        } else {
            y += -deltaY;
            if (y <= 0) {
                upDown = true;
                updateDelta();
            }
        }

    }

更新:

球弹回并停在gui的底部。

public void verticalBounce(Container container) {

    deltaY = deltaY - gravity;
    y = y + deltaY;

    if (y > getHeight()) {
        y = getHeight(); // reset location
        deltaY = (int) (deltaY * -0.9); // slows down ball
    }

}

3 个答案:

答案 0 :(得分:2)

这些代码看起来都不正确。你需要实现直线运动的方程:

http://en.wikipedia.org/wiki/Linear_motion

您需要的是s = ut + 0.5 * a * t * t,其中

s = distance
u = an initial velocity - regard as the speed at which it hits the ground 
a = acceleration due to gravity (you can probably have this pretty arbitrary)
t = time

你在前进的路上反转a的标志。

要模拟有损弹跳,请通过从系统中取出一定比例的能量E来减少u

new_u * new_u = (1 - E)u * u

(这来自移动体的动能的公式)。

我可以从你的问题中看出你有能力实现这个,所以我不会提供代码;只是物理学。

答案 1 :(得分:2)

首先,弹跳球中没有随机元素。这一切都取决于作用在球上的力以及球的速度和方向。如果你添加一点随机性,它可能会使它看起来更逼真,因为球的风和不平衡但很少。

要编程,假设球以某种速度从地面射出。你需要存储:

  • Y =位于地面以上的位置。从0开始。
  • deltaY =每个时间间隔的单位速度。负面是下降。积极向上。从10开始。
  • gravity =每个时间间隔的变化单位加速度。重力总是负的和恒定的。从-2开始并尝试一些值。

除非您希望球在到达弹跳顶部时从屏幕上消失,否则您需要选择天花板高度。比如说100.(最好选择最适合你的图形区域的高度。)

因此,对于每个时间间隔/刻度/循环,您执行以下操作:

  • 通过从deltaY中减去重力来调整重力。 (如果球向下移动,它将移动得更快。如果球向上移动,它将移动得更慢。)
  • 通过将deltaY添加到Y来移动球。

然后你必须检查:球是否击中地面或天花板? Y大于天花板值或小于地面值(0)。

如果是这样,你必须通过以下方式反弹:

  • 移动Y使得如果X经过边界(地面/天花板),则它在边界内变为X. (如果Y = 110且天花板= 100,则将Y设置为90.如果Y = -5,则将其设置为+5。)
  • 否定deltaY。反弹时方向反转。 (deltaY = -deltaY)
  • 将deltaY减少百分比。反弹时会损失一些能量,因此弹跳后速度会变慢。 (deltaY = deltaY * 0.90或其他一些数量)@Bathsheba称之为从系统中消除能量。

这就是它的全部内容。你必须摆弄这些数字才能让它以合理的速度起飞。你必须调整时间间隔。你不必与现实生活相匹配。做好看的事。

随着时间的推移,速度将降低到0。

(尽管我之前说过,添加或减去一小部分随机量实际上看起来很酷。)

答案 2 :(得分:0)

你的球随机弹跳而不是慢慢减速。你需要每次弹跳都降低你的速度,直到速度低于最小值,然后使速度为0并停止弹跳。