Java 创建游戏循环(游戏更新)
Java creating game loop (game update)
在我的 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*/
}
}
我的帖子 运行 正确吗?
您可以使用方法 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()
不同,此方法试图跟上。因此,如果一个游戏 tick 花费的时间足以延迟下一个游戏 tick,则执行程序服务将在计算下一个睡眠持续时间时考虑这一点。
在我的 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*/
}
}
我的帖子 运行 正确吗?
您可以使用方法 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()
不同,此方法试图跟上。因此,如果一个游戏 tick 花费的时间足以延迟下一个游戏 tick,则执行程序服务将在计算下一个睡眠持续时间时考虑这一点。