2

我可以从谷歌搜索中看到这个问题被问了很多,但我找到的解决方案都没有为我做这件事。你知道,我正在用 Java 制作一个带有图像的游戏,因为游戏通常都有这些东西。但是整个表格一直在闪烁,我无法让它停止。是的,我已经对其进行了双重缓冲并覆盖了 update() 方法,虽然这确实有帮助,但闪烁仍然存在。我不知道我是否对双缓冲做错了,或者我是否需要完全不同的东西。

起初我以为它可能与 clearRect() 行有关,但删除它后,游戏仍然闪烁,但当然不是每次都清除。所以这根本没有帮助。减慢计时器后,闪烁确实几乎完全消失了,但我需要将其减慢到 100 毫秒,即使那样我仍然会出现一些闪烁。此外,这对游戏来说太慢了。我尝试让一个计时器在 10 毫秒计时器上完成所有工作,另外一个计时器在 100 毫秒进行绘画,但它看起来很跳跃。我可以将绘画计时器减慢到大约 30 毫秒,并且它仍然很流畅,尽管闪烁仍然是一个问题。

必须有一种方法可以每 10-30 毫秒执行一次而不会闪烁。是否有其他类似于双缓冲但在这种情况下更好的方法,或者我可以使用的方法?提前感谢您的帮助。

public class main extends JApplet implements ActionListener {
    //This Declares The Variables
    Graphics2D buffer;
    Image offscreen;
    Timer timGame = new Timer(10, this);
    //other variables

    public void init(){
        //This Creates The Offscreen Buffer Zone
        offscreen = createImage(getSize().width, getSize().height);
        buffer = (Graphics2D)offscreen.getGraphics();
        //other initialization stuff irrelevant to drawing
    }

    public void actionPerformed(ActionEvent evt){
        if (evt.getSource() == timGame)
            runGame();
    }

    private void runGame(){
        //Do stuff, move objects
        repaint();
    }

    public void paint(Graphics g){
        super.paint(g);

        buffer.clearRect(0, 0, getSize().width, getSize().height);
        //draw stuff to buffer
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics gr){
        paint(gr);
    }
4

1 回答 1

9

不要直接在paint(...)JApplet 或 JFrame 等顶级窗口的方法中绘制,因为您会丢失所有双缓冲和所有 Swing 好东西。而是paintComponent(...)使用您添加到 JApplet 的 JPanel 或其他 JComponent 派生组件(包括 JComponent 本身)的方法。

如果您在此处或在 Google 中搜索此主题,您会看到在此和其他网站上已多次询问和回答,答案都是一样的。

例如

于 2012-05-04T03:11:18.323 回答