2

我四处搜索并遇到了不同类型的游戏循环。我一直用

扩展 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);
}

然后在主要我有一个正常的可运行循环与睡眠

@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 来安排游戏更新。但否则我不需要那么多更改我的代码,或者我在这里遗漏了什么?

4

1 回答 1

-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

于 2013-08-16T07:54:38.987 回答