游戏循环:
private int FPS = 25;
private int targetTime = 1000 / FPS;
public void run(){
init();
long start;
long elapsed;
long wait;
while (running){
start = System.nanoTime();
init();
repaint();
elapsed = System.nanoTime() - start;
wait = targetTime - elapsed / 1000000;
try {
Thread.sleep(wait);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
绘画方法:
/**draws the game graphics*/
public void paint(Graphics g){
super.paint(g);
Graphics2D g2 = (Graphics2D)g;
gameStateHandler.draw(g2);
}
paint方法所引用的方法:
private static Image image = resourceLoader.getImage("/background/menu_background.png");
/**draws the menu state*/
public static void draw(Graphics2D g){
g.drawImage(image, 0, 0, null);
}
我通过此方法调用图像,该图像位于图像的同一文件夹中
static resourceLoader rl = new resourceLoader();
public static Image getImage(String image){
return Toolkit.getDefaultToolkit().getImage(rl.getClass().getResource(image));
}
我有一个游戏循环,它将每秒调用repaint();
60次,而在paint方法中,它指的是此方法绘制图像的方法。一切看起来都很顺利,当我运行程序时,图像出现并在快速时间消失,有时图像出现并且没有发生任何不良事件但是在经过一段随机时间之后事情发生了我将fps从低变高到高变高在这个项目中使用jpanel仍然是相同的
答案 0 :(得分:0)
不要使用Thread.sleep()。如果在EDT上调用,可能会导致口吃。
对于挥杆,你应该使用javax.swing.Timer:
1.使用所需的延迟(targetTime)初始化Timer
2.在计时器actionPerformed()上调用repaint()。
答案 1 :(得分:0)
在游戏循环中,
之后 wait = targetTime - elapsed / 1000000;
添加行
wait = Math.max(5L, wait);
让你的等待时间变得太小或变得消极。
答案 2 :(得分:0)
好的,所以这里有一个建议,很可能是你需要的修复:
使用paintComponent()
代替paint()
// draws the game graphics
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
gameStateHandler.draw(g2);
}
paintComponent
是recommended way to use JPanels to paint in Java - 另见a more detailed explanation of custom painting in Swing。很可能您使用paint()
会导致视觉上的不一致。
如果做不到这一点,我建议您查看如何加载资源,但这应该有效,所以我认为这不是问题。