java中不同类型的游戏循环
问题描述:
我已经搜索过并遇到过不同类型的游戏循环。我一直使用java中不同类型的游戏循环
Screen.java扩展了JFrame,同时也添加了所有通常位于两个不同的.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);
}
然后在主我有睡眠
@Override
public void run(){
while(true){
//all update code goes here.
try{ Thread.sleep(1); }catch(Exception e){}
}
}
正常Runnable的循环,但我看到有人用定时器,信号量,和TimerTask来创建一个运行循环,采取的护理建议输入,更新,最后重新排序。所以我觉得哪种方法最好?因为它接缝,如果我使用TimerTask的创建循环,渲染游戏它接缝,我需要锁定它到一个特定的FPS。
对于我所看到和理解的,我可以使用Timer和TimerTask来安排游戏更新。但是,我不知道如何改变我的代码,或者我在这里错过了什么?
答
对于游戏,我建议你只在计算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)
你可以使用一个布尔停止和启动游戏,也许如果您使用不同Gamestates。你也可以在这个循环内更新并尽可能地进行渲染。您也可以创建update(float elapsed)
而不是update()
方法,以便您可以更新位置和其他内容一致。
而且看这个问题:https://gamedev.stackexchange.com/questions/59181/proper-method-to-update-and-draw-from-game-loop
我已经投票决定关闭这个问题,因为它会吸引自以为是的回答和辩论。大多数“*什么是最好的X *?”问题不适合Stack Overflow。 –
尽管你的'paint'方法令人担忧,除了确保你更新屏幕与EDT正确同步之外,我会说你的'Runnable'方法可能是最明智的,只要你正确地考虑到尝试保持帧速率一致... – MadProgrammer
以及我现在有更新的涂料方法,然后我可以。我不能说我的更新方法,因为我使用Thread.sleep() – Yemto