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帮助:((
答案 0 :(得分:0)
您正在阻止UI线程。
基本上,运行渲染代码的调用者(绘制球的位置)看起来像这样:
while (true) {
drawing = your_code();
copy_drawing_to_GPU(drawing);
}
这意味着,您的代码更新只会在之后显示。你的for循环完全在一个&#34;绘制调用&#34; (它通常被称为帧,FPS术语的起源 - 每秒帧数 - 在游戏中)。您的代码最终会这样做:
希望这是有道理的。
为此提供了几个解决方案:
最佳解决方案,以及游戏中通常使用的解决方案是使用&#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; - 如果你的程序开始滞后并需要很长时间来渲染一个帧,它看起来会很不稳定,但是球仍将以相同的速度移动(在某种程度上,你需要更先进的技术来实现严重的延迟)。
另一种选择是使用单独的线程。这个选项很糟糕,我不建议使用它。