java 使用游戏循环时图像出现和消失
java image appears and disappears when using game loop
游戏循环:
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
不要使用 Thread.sleep()。如果在 EDT 上调用它可能会导致卡顿。
对于摇摆你应该使用 javax.swing.Timer:
1. 以所需的延迟时间(您的目标时间)初始化计时器。
2. 在计时器 actionPerformed() 上调用 repaint()。
在你的游戏循环中,
wait = targetTime - elapsed / 1000000;
添加行
wait = Math.max(5L, wait);
防止您的等待时间变得太短或变为负值。
好的,这里有一个建议,很可能是您需要的修复方法:
使用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 - see also a more detailed explanation of custom painting in Swing。很可能是您对 paint()
的使用导致了您的视觉不一致。
如果做不到这一点,我建议您查看您是如何加载资源的,但这应该可行,所以我认为这不是问题所在。
游戏循环:
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
不要使用 Thread.sleep()。如果在 EDT 上调用它可能会导致卡顿。
对于摇摆你应该使用 javax.swing.Timer:
1. 以所需的延迟时间(您的目标时间)初始化计时器。
2. 在计时器 actionPerformed() 上调用 repaint()。
在你的游戏循环中,
wait = targetTime - elapsed / 1000000;
添加行
wait = Math.max(5L, wait);
防止您的等待时间变得太短或变为负值。
好的,这里有一个建议,很可能是您需要的修复方法:
使用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 - see also a more detailed explanation of custom painting in Swing。很可能是您对 paint()
的使用导致了您的视觉不一致。
如果做不到这一点,我建议您查看您是如何加载资源的,但这应该可行,所以我认为这不是问题所在。