【问题标题】:Bring Ball To A Stop让球停下来
【发布时间】:2013-09-24 19:11:08
【问题描述】:

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

}

【问题讨论】:

  • 那么当球落到底部时会发生什么?
  • 每当我点击 GUI 时,球会向上移动到窗口顶部,然后向下弹跳,然后再次向上弹跳。每次从墙上反弹都会加快或减慢速度。
  • @NPE 这是代码行if (y &lt;- 0)检测底部并改变方向标志upDown
  • @LeeMeador 我更新了。也许你可以看看,让我知道你的想法
  • 两件事:1)if (y &gt; top) y = top - (y - top)if (y &lt; bottom) y = bottom + (bottom - y) 将阻止球从顶部和底部传出。请记住设置顶部和底部,这样球的完整图像就不会超出图形区域。 (如果球是在 height=y 处绘制的半径为 5 的圆......将底部设置为 5,以便整个圆始终显示。出于同样的原因,将顶部设置为 maxY - 5。)

标签: java math user-interface methods gravity


【解决方案1】:

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

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.

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

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

【讨论】:

  • @NPE 也许,但对random 的调用让我感到困惑。
  • 要制作弹跳球图形,您需要每个时间间隔/循环的位置。我想那是你的s。方程的形式需要使您可以采用s 并计算s'(下一个位置)。
  • 不,我的表述方式是 s 是绝对距离;在浮点中这样做更稳定。不过我喜欢你的回答,因此 +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。

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

【讨论】:

  • 一直在玩你的建议,但似乎无法阻止球
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多