我正在用Java开发一个简单的2D游戏,一切正常.为了找到正确的FPS刷新/重绘/更新,我使用currentTimeMillis来查找差异.
问题是currentTimeMillis有时会返回负值,而Thread.sleep会抛出异常(java.lang.IllegalArgumentException:timeout值为负)
我做的是在我的游戏中放一段时间,而currentTimeMillis <= -1再次检查直到它结束,然后睡觉.
代码示例:
private void gameLoop(){
// Find FPS
long FPS = 40;
long beginTime = System.currentTimeMillis();
while(beginTime < -1){
beginTime = System.currentTimeMillis();
}
while(!done){
// Sleep
try{
beginTime += FPS;
long currTime = System.currentTimeMillis();
while(currTime < -1){
currTime = System.currentTimeMillis();
}
difference = (beginTime - currTime);
// Should be (currTime - beginTime)
Thread.sleep(difference);
}catch (Exception e){
e.printStackTrace();
}
// RENDER GAME
renderGame();
}
JOptionPane.showMessageDialog(null, "Game Over\nYou Died.");
System.exit(0);
}// end gameLoop()
Run Code Online (Sandbox Code Playgroud)
当游戏开始时,这很好,但有时我仍然得到例外.有没有更好的办法?我仍然认为它返回负值是很奇怪的.
Bri*_*new 11
真正的问题beginTime-currTime不是消极的吗?
difference = (beginTime - currTime);
Thread.sleep(difference);
Run Code Online (Sandbox Code Playgroud)
我注意到你添加FPS(40)beginTime.但如果currentTime大于beginTime+FPS,你就会遇到问题.
如果你试图定期安排一些事情(我认为你是这样),请查看Timer,这样你就可以更简单/可靠地完成这项工作.
imho以下指示:
difference = (beginTime - currTime);
Run Code Online (Sandbox Code Playgroud)
应该:
difference = (currTime - beginTime);
Run Code Online (Sandbox Code Playgroud)
currTime总是大于beginTime,因此差异总是负数或至少为0.
| 归档时间: |
|
| 查看次数: |
8306 次 |
| 最近记录: |