如何在拖放中动画落球?它是SetLocation(x,y)和线程吗?

时间:2014-10-15 00:49:01

标签: java

for(int a=0;a<380;a++){
           try{
               Thread.sleep(5);
           }catch(Exception e){
               System.out.println(e);
           }
           item.setLocation(300, a);
       }

这是我的项目向下移动的过程,但我的问题是我不能一寸一寸地移动它。 项目仅显示在(300,0)和(300,380)中,假设为0,1,2,3,4 ---- 380帮助:((

1 个答案:

答案 0 :(得分:0)

您正在阻止UI线程。

基本上,运行渲染代码的调用者(绘制球的位置)看起来像这样:

while (true) {
    drawing = your_code();
    copy_drawing_to_GPU(drawing);
}

这意味着,您的代码更新只会在之后显示。你的for循环完全在一个&#34;绘制调用&#34; (它通常被称为帧,FPS术语的起源 - 每秒帧数 - 在游戏中)。您的代码最终会这样做:

  • 致电
  • 睡5毫秒
  • 移动1像素
  • 睡5ms
  • 移动1像素
  • ...重复多次..
  • 返回来电者
  • 实际绘制对象仅一次

希望这是有道理的。

为此提供了几个解决方案:

最佳解决方案,以及游戏中通常使用的解决方案是使用&#34; delta times&#34;。基本上,你计算你希望你的球以像素/毫秒为单位移动的速度,以及从最后一帧开始经过的时间,然后将它们相乘以得到移动此帧的像素数。这很容易实现:

time = System.currentTimeMillis()
while (true) {
    drawing = update(System.currentTimeMillis() - time); // the "delta time"
    copy_to_GPU(drawing);
    time = System.currentTimeMillis();
}

然后,在您的代码中,您只需执行以下操作,而不是使用for循环:

item.setLocation(300, item.yPosition + deltaTime * item.ySpeed);
if (item.yPosition >= 380) {
    item.yPosition = 380;
    item.ySpeed = 0;
}

这可以正确地将您的位置更新扩展到正确的帧数。作为奖励,它还使您的计划&#34;滞后独立&#34; - 如果你的程序开始滞后并需要很长时间来渲染一个帧,它看起来会很不稳定,但是球仍将以相同的速度移动(在某种程度上,你需要更先进的技术来实现严重的延迟)​​。

另一种选择是使用单独的线程。这个选项很糟糕,我不建议使用它。