在我的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*/
}
}
并且我的线程是否正常运行?
答案 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()
不同,此方法试图跟上。因此,如果一个游戏时间长度足以延迟下一个游戏时间,则执行者服务将在下一个睡眠持续时间的计算中考虑这一点。