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来安排游戏更新。但是,我不知道如何改变我的代码,或者我在这里错过了什么?

+1

我已经投票决定关闭这个问题,因为它会吸引自以为是的回答和辩论。大多数“*什么是最好的X *?”问题不适合Stack Overflow。 –

+0

尽管你的'paint'方法令人担忧,除了确保你更新屏幕与EDT正确同步之外,我会说你的'Runnable'方法可能是最明智的,只要你正确地考虑到尝试保持帧速率一致... – MadProgrammer

+0

以及我现在有更新的涂料方法,然后我可以。我不能说我的更新方法,因为我使用Thread.sleep() – Yemto

对于游戏,我建议你只在计算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

+0

这是关于稳定性,然后fps,但是,接缝锁定fps为60.如果我使用方法我现在有fps的变化取决于计算机可以处理什么。这只是我需要得到一个很好的更新()循环 – Yemto

+0

你不必锁定fps;)我只是这样做。看看我编辑过的链接。 – Loki

+0

它仍然被锁定...或者至少受到限制,当使用我目前的方法时,只要电脑可以处理它们,帧就会更新 – Yemto