2014-02-26 41 views
0

我正在开发一个2d游戏来帮助自学java 2d游戏开发,并且遇到了一个我无法解决的问题。逐渐减慢球的运动

我有一个球在屏幕上移动。如果我按下右箭头键,它会将球向右移动1个像素,如果我按住右箭头键则会增加球的移动速度。

我的问题是,我想让球在我释放按钮后逐渐减慢,我找不到一种方法来做到这一点。所有我能想到的是慢慢地降低速度,并使用“thread.sleep()”来阻止它立即达到0,但显然这只是停止整个动画,它看起来很糟糕。

我还有其他选择吗(我想我需要在这里使用计时器)?

-Panda

+1

你能发布你的代码吗? – leigero

+0

试着看看[这个例子](http://stackoverflow.com/questions/19626338/japplet-creates-a-ball-that-bounces-and-gets-progressively-less-high-in-java/19626396 #19626396)和[这个例子](http://stackoverflow.com/questions/15897947/problems-with-javas-paint-method-ridiculous-refresh-velocity/15900205#15900205)这两个演示使用减少向量。特别是第二个...... – MadProgrammer

回答

0

您需要告诉我们您正在使用的GUI库。假设秋千:

  • 如果需要,您可以更改计时器内部的延时。
  • 或者(我认为这样更好),您可以减少定时器内每个时间片移动的距离。
  • 如果你选择上面的第二个建议,你可能会更好使用双变量建模你的距离和速度,但只是在显示时转换为整数。
  • 如果使用Swing,我已经使用Key Bindings来触发移动,通过按键更改一个开始移动的布尔值,然后释放键恢复布尔值。
  • 您可以使用第二个布尔值,一个在键释放后立即激活的slowingDown布尔值,一旦移动停止,最终会变为false。
0

尝试建立这样的:

boolean isAccelerating = false; 

而且在你按下键设置的值更改为true当你按下右箭头。当您释放右箭头键时将其更改回false

当你不断更新球的位置,如果isAccelerating是假的(即你放开右箭头),然后做一个locationX -= 1

你也想添加一个if语句,以防止它跑出屏幕:

if(locationX < = 0){ 
ball.setLocation(0,x) // or wherever you want it to stop. 

没有代码很难更具体。

0

就足以让你开始...

你需要追踪加速度和位置(每个载体),然后应用d = 1/2原子^ 2 + VIT(谷歌公式)来你在每个计时器上的位置tick,其中t是现在和最后一个计时器tick之间的时间差。

当速度改变方向,设置为0。

0

如果要逐渐减速,做到这一点的最简单的方法就是用一个小数乘以你的速度,即速度* = 0.5。

这会使您的当前速度每循环减半,这意味着每次减少会逐渐减少,从而使您平稳停止。