2013-09-24 19 views
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(); 
      } 
     } 

    } 

UPDATE:

球反弹,并停止在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 
    } 

} 
+0

所以会发生什么时球击中底部? – NPE

+0

每当我点击GUI时,球就会向上移动到窗口的顶部,然后弹跳下来然后再次弹起。每个从墙上反弹都可以加速或减速。 – PrgmRNoob

+0

@NPE这是代码行if(y < - 0)'检测底部并更改方向标志'upDown'。 –

回答

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

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

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

+0

@NPE也许,但对“随机”的呼吁让我困惑。 – Bathsheba

+0

要做弹跳球图形,你需要每个时间间隔/循环的位置。我认为那是你的''。方程式需要采用“s'和计算s''(下一个位置)的形式。 –

+1

不,我制定它的方式是s是绝对距离;以浮点的方式更稳定。虽然我喜欢你的回答,因此+1 – Bathsheba

0

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

2

首先,弹跳球中没有随机元素。它的全部由作用在球上的力以及球的速度和方向决定。如果增加一点随机性,可能会使它看起来更真实一些,因为风和球的不平衡性,但它很少。

要编程它,假设球以某种速度从地面起飞。您需要存储:

  • Y =位于地面以上的单位。从0开始。
  • deltaY =单位时间间隔内的速度。负面影响下降。积极向上。从10开始。
  • gravity =以每个时间间隔的变化为单位的加速度。重力始终是负面的和不变的。从-2开始,尝试一些值。

除非您希望球在屏幕上消失,因为它会到达反弹顶部,您需要选择天花板高度。说100.(这是最好的选择,以匹配您的图形区域的高度,虽然。)

因此,对于每个时间间隔/周期/循环您做到以下几点:

  • 由移动deltaY减去重心调整重心。 (如果球向下移动将移动更快,如果其移动时,它会移动速度较慢。)
  • 移动球,加入移动deltaY为Y.

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

如果是的话,你必须要反弹吗:

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

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

随着时间的推移,速度会降低为0。

(而且,尽管我之前所说的,加上或减去一个小随机量实际上看起来挺酷的。)

+0

好东西。我会尽力将你的文字转换成代码! – PrgmRNoob

+0

一直在玩你的建议,但似乎无法停止球 – PrgmRNoob