Java创建游戏循环(游戏更新)

时间:2015-12-09 12:56:32

标签: java frames game-loop

在我的2D游戏中,我不确定我的FPS和我的游戏帧更新方法。当我想要打印出来,检查它是否在控制台中工作时,它从不写任何东西。我错过了什么吗?

public class Main extends JFrame implements Runnable{

private static final long serialVersionUID = 1L;

static boolean running = true;

/* My game fps */
public void run() {

    int FRAMES_PER_SECOND = 25;
    int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
    long next_game_tick = System.currentTimeMillis();
    long sleep_time = 0;

    while(running){

        updateGame();
        System.out.println("game updated")
        next_game_tick = SKIP_TICKS;
        sleep_time = next_game_tick - System.currentTimeMillis();

        if(sleep_time > 0){

            try {

                Thread.sleep(sleep_time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public static void main(String[] args){

    platform g = new platform();
    g.setVisible(true);
    g.setSize(900, 900);
    g.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    g.setResizable(false);

    (new Thread(new Main())).start();
}   

private void updateGame() {

    /*(e.g)all game code*/
}

}

并且我的线程是否正常运行?

1 个答案:

答案 0 :(得分:0)

您可以使用方法ScheduledExecutorService.scheduleAtFixedRate()

public class GameLoop {
    private static final int FPS = 60;

    public static void main(String[] args) {
        new GameLoop().startGame();
    }

    private void startGame() {
        ScheduledExecutorService executor = Executors
                .newSingleThreadScheduledExecutor();
        executor.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                updateGame();
            }
        }, 0, 1000 / FPS, TimeUnit.MILLISECONDS);
    }

    private void updateGame() {
        System.out.println("game updated");
        // the game code
    }
}

每秒调用方法updateGame 60次。与方法ScheduledExecutorService.scheduleAtFixedDelay()不同,此方法试图跟上。因此,如果一个游戏时间长度足以延迟下一个游戏时间,则执行者服务将在下一个睡眠持续时间的计算中考虑这一点。