2

我的程序中有以下方法可以让球不断弹跳。我尝试过修改,但似乎无法让球停在我的 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
    }

}
4

3 回答 3

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你在上升的路上反转标志。

为了模拟有损弹跳,u通过从系统中取出某个能量因子 E 来减少:

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

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

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

于 2013-09-24T19:15:13.140 回答
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。

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

于 2013-09-24T19:33:47.467 回答
0

你的球随机弹跳,而不是速度缓慢下降。您需要在每次弹跳时降低速度,直到速度低于 minimumMovement 然后将速度设为 0 并停止弹跳。

于 2013-09-24T19:17:31.833 回答