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() 的使用导致了您的视觉不一致。

如果做不到这一点,我建议您查看您是如何加载资源的,但这应该可行,所以我认为这不是问题所在。