我正在用java开发一个简单的"乒乓球"2d游戏。
(我之前的问题涉及一个计时器。我已经把它改成了一个线程,这是一个不同的主题,所以我认为应该做一个新问题)。
游戏使用一个一直运行的线程来移动屏幕上的对象,并不断地重新绘制。
我在线程中添加了一些代码,以确保游戏以恒定的速度运行,但这似乎不起作用。
在比赛的前几秒,它总是很快("乒乓球"飞得很快),然后它突然变慢,速度似乎很恒定。
为什么会发生这种情况?以下是Runnable
:的run()
方法的代码
public void run(){
beforeTime = System.currentTimeMillis();
while(true){
bPaddle.move();
tPaddle.move();
ball.move();
checkCollision();
checkInScreen();
repaint();
timeDiff = System.currentTimeMillis() - beforeTime;
sleep = 5 - timeDiff;
System.out.println(sleep);
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {}
beforeTime = System.currentTimeMillis();
}
}
IMO您不应该在"实时"游戏中依赖"睡眠"方法。
你应该做的是:
- 定义与时间跨度绑定的速度。(假设你拥有的任何速度都意味着这是实体在1000ms内应该移动的单位数量)。例如,你的球在1000毫秒内移动10倍
- 每次循环开始另一轮时,计算循环上次运行时的时间差
- 假设上一次循环运行(在严重滞后之后)在过去500ms
- 您计算的时间百分比:500ms/1000ms*100=50%
- 将时间百分比应用于每个与时间相关的操作。例如,移动球:10px*0.5=5px。意思是:把你的球在这一帧移动5倍
与游戏中的任何其他东西一样,这取决于时间!
使用这种"思考",你将使你的引擎"cpu速度独立",它将在任何机器上运行(基本上)相同。(不要引用我的话:P)
睡眠的唯一时间(imho)是,当你想放慢游戏速度以防它跑得太快时——因为你可能会得到非常小的数字。。。