java中不同类型的游戏循环

时间:2013-08-16 07:49:08

标签: java game-loop

我已经四处寻找并遇到了不同类型的游戏循环。我一直用

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

1 个答案:

答案 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