你如何为游戏增加一倍的Java缓冲区?你如何为游戏增加一倍的Java缓冲区?(How do you

2019-05-13 22:43发布

所以在比赛中我的工作,我有一个大理石跟随鼠标,但它这样做时,屏幕闪烁。

背景包括两个JPEG文件和9米的矩形。 我怎么会去双缓冲呢? 下面是主窗口中的代码。

/**
 * Write a description of class Window here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Window extends JApplet implements MouseMotionListener
{
    private BufferedImage image; 
    private BufferedImage side;
    private int mouseX;
    private int mouseY;

    public Window(){
        try {
            image = ImageIO.read(new File("Backgrounds/violet.jpg"));
            side = ImageIO.read(new File("Backgrounds/side margin.jpg"));
        } catch (IOException ex) { }    
    }   

    private void delay(int delay)
    {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException e) {}
    }

    public void init()
    {
        this.addMouseMotionListener(this);
    }

    public void paint (Graphics page)
    {
        page.drawImage(image, 0, 0, null);
        page.setColor(Color.blue);
        page.fillRect(0, 0, 160, 160);
        page.setColor(Color.black);
        page.fillRect(15, 15, 130, 130);
        page.setColor(Color.green);
        page.fillRect(340, 0, 160, 160);
        page.setColor(Color.black);
        page.fillRect(355, 15, 130, 130);
        page.setColor(Color.yellow);
        page.fillRect(0, 340, 160, 160);
        page.setColor(Color.black);
        page.fillRect(15, 355, 130, 130);
        page.setColor(Color.red);
        page.fillRect(340, 340, 160, 160);
        page.setColor(Color.black);
        page.fillRect(355, 355, 130, 130);
        page.drawImage(side, 500, 0, null);
        page.drawString(Score.getScore(), 560, 110);
        //conveyors
        page.setColor(Color.gray);
        page.fillRect(235, 0, 30, 160);

        //marble
        delay(100);

        page.fillOval(mouseX, mouseY , 40, 40);          
    }

    public void mouseMoved(MouseEvent e)
    {
        mouseX = e.getX();
        mouseY = e.getY();
        repaint();
    }

    public void mouseDragged(MouseEvent e)
    {

    }
}

Answer 1:

双缓冲概念相当简单,而不是逐个绘制你的对象,在绘制的图像上,然后告诉渲染器来绘制整个图像。 这消除了闪烁。

这里有一个如何做到这一点的例子( 源 )

class DoubleBufferedCanvas extends Canvas {

    public void update(Graphics g) {
    Graphics offgc;
    Image offscreen = null;
    Dimension d = size();

    // create the offscreen buffer and associated Graphics
    offscreen = createImage(d.width, d.height);
    offgc = offscreen.getGraphics();
    // clear the exposed area
    offgc.setColor(getBackground());
    offgc.fillRect(0, 0, d.width, d.height);
    offgc.setColor(getForeground());
    // do normal redraw
    paint(offgc);
    // transfer offscreen to window
    g.drawImage(offscreen, 0, 0, this);
    }
}

Nowdays,你没有这个实现自己,你可以使用BufferStrategy使用和相关型号的类。 见lakam99的答案的一个例子。



Answer 2:

摇摆自动支持双缓冲,所以你不需要任何代码。

只需拨打setDoubleBuffered(true)在您的顶级组件(通常是一个JPanel),并务必将所有的工作。

请参阅: setDoubleBuffered



Answer 3:

另一种解决方案是使用双会为你缓冲库。 由于您使用的Java2D我假设你希望把一切都非常轻便,较低的水平。 我认为Slick2D确实提供简单,2D绘图和输入功能,而无需在您的方式获得了伟大的工作。 这感觉就像Java2D的更优雅的版本,而是写上的OpenGL。 一旦你做了几个应用程序与纯Java,我想移动到Slick2D是一个好主意。 这不是一个直接的解决您的问题,但由于它已经解决了我认为Id提供一些建议,这将使你的Java游戏开发的生活更轻松。 检查出来,如果你有机会http://slick.cokeandcode.com/



Answer 4:

我觉得你的问题不是双缓冲。 您必须添加super.paint(page); 在你的绘制方法的第一行。



文章来源: How do you double buffer in java for a game?