【问题标题】:Bouncing Ball Gravity弹跳球重力
【发布时间】:2013-09-26 01:36:11
【问题描述】:

请看下面的代码... 球像普通球一样弹跳,但随后球停止,然后从 GUI 上下沉。关于此代码可能有什么问题的任何想法?

public void verticalBounce(Container container) {
        deltaY = deltaY - gravity;
        y = y + deltaY;

        if (y >= getHeight()) {
            deltaY = -deltaY;
            deltaY = (int) (deltaY * 0.9);
            y -= -deltaY;
        }
    }

【问题讨论】:

  • 也许问题是这一行 y -= -deltaY; 你不打算再次将 deltaY 添加到 y ,但这就是你正在做的事情。 y = y + deltaY
  • 也试过了。仍然停止然后下沉
  • 我原以为一旦胆汁超过可视区域的高度,您将不得不 1- 反转 delta 并 2- 重置对象的位置。所以deltaY *= -1y = getHeight() 或类似的东西......假设你想投球......
  • @golf_pro90 他的意思是改用y -= deltaY
  • 作为一个可能的概念/想法的example

标签: java math user-interface jpanel gravity


【解决方案1】:

我将使用y' 表示此时间片末尾的 y 位置,y 表示前一个时间片末尾的位置,严格来说是为了便于标记。这使您的代码的第三行:

y' = y + deltaY;

让我们考虑y' 严格大于getHeight() 的情况。 (它们相等的情况最终会被自动考虑,如下所示。)情况的快速绘制如下所示:

           _   o  - y
          |    o
          |    o
----------|--------------------- getHeight()
          |    O
 deltaY - |    O
          |    O
          |_   O  - y'

在当前时间片的某个时间点,球撞到了地板上(在 getHeight() 处)。对于当前时间片的剩余时间,我们超出了地板的数量:

y' - getHeight()

我们需要这个余数是球在当前时间片内向上反弹的量。当前时间片结束时的实际 y 位置(暂时忽略您的弹性常数)如下所示:

                     _   O  - y''
     _   o  - y     |    O
    |    o          |    O
    |    o          |    O
-------------------------------- getHeight()

现在,y''getHeight() 减去我们在上面计算的超出底线的量:

y'' = getHeight() - (y' - getHeight());

(您可能很想将其更改为 2*getHeight() - y',但请坚持到最后。)

我们现在将快速回顾我们之前忽略的案例,其中y' == getHeight()。如您所见,y' - getHeight() 变为零,而y'' == getHeight() 则按照我们的需要,因此对于这种情况没有额外的工作要做。

很好,所以我们现在需要做的就是处理弹性常数(我假设这就是 0.9 因子的用途,因此反弹会随着时间的推移而衰减)。我们想将它应用于deltaY,就像你所做的那样,但我们还需要将它应用于当前时间片中的反弹,因为它撞到了地板:

y'' = getHeight() - 0.9*(y' - getHeight());

由于我们没有在任何计算的右侧混合yy'y'',我们可以简单地将它们全部替换为y,从而得到最终的if子句(只更改了最后一行):

    if (y >= getHeight()) {
        deltaY = -deltaY;
        deltaY = (int) (deltaY * 0.9);
        y = getHeight() - 0.9*(y - getHeight());
    }

我敢肯定,如果您拿出以前的解决方案,您就会发现它们哪里出了问题。此外,在我看来,对 deltaY 使用 int 似乎是在自找麻烦。我宁愿使用浮点数进行所有计算,然后仅在绘图时进行舍入。你会注意到我没有对上面y 的结果进行任何转换,这可能是必要的,具体取决于y 的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-05
    • 2017-09-29
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多