我已经四处寻找并遇到了不同类型的游戏循环。我一直用
扩展JFrame的Screen.java,还添加了所有的监听器,通常是两个不同的.java用于键盘,一个用于鼠标。
public void Draw(Graphics g){
Graphics2D g2 = (Graphics2D)g;
//Everything that I render at the screen goes here, or I pass along g2 to them so they can be rendered. Such as level.draw(g2);
repaint();
}
@Override
public void paint(Graphics g){
Image offScreenBuffer = createImage(getWidth(), getHeight());
Draw(offScreenBuffer.getGraphics());
g.drawImage(offScreenBuffer, 0, 0, null);
}
然后在主要的我有一个普通的Runnable循环与睡眠
@Override
public void run(){
while(true){
//all update code goes here.
try{ Thread.sleep(1); }catch(Exception e){}
}
}
但是我看到人们建议使用Timer,Semaphore和TimerTask创建一个运行循环来处理输入,更新和最后一次重新编译。所以我觉得哪种方法最好?如果我使用TimerTask创建循环来渲染游戏,我需要将其锁定到某个fps。
对于我所看到和理解的内容,我可以使用Timer和TimerTask来安排游戏更新。但是我不知道如何更改我的代码,或者我在这里遗漏了什么?
答案 0 :(得分:-1)
对于游戏,我建议您到时间只计算FPS。这完全是关于FPS:
private void run()
{
long now = System.currentTimeMillis();
long last = 0;
int fps = 60;
while(true)
{
if(now-last >= 1000/fps)
{
//do your stuff
update();
render();
System.out.println("test");
last = now;
}
now = System.currentTimeMillis();
}
}
你可以在这里添加一些内容,而不是while(true)
你可以使用布尔来停止和开始游戏,也许你可以使用不同的游戏状态。您也可以在此循环内更新并尽可能频繁地渲染。您也可以创建update(float elapsed)
而不是update()
方法,这样您就可以更新位置和其他内容。
另请看这个问题:https://gamedev.stackexchange.com/questions/59181/proper-method-to-update-and-draw-from-game-loop