¿Cómo se doble búfer en java para un juego?

Por lo que en el juego en el que estoy trabajando, tengo un mármol siga al ratón, pero cuando lo hace la pantalla parpadea.

El fondo incluye dos archivos jpeg y 9 rectángulos. Cómo se podría ir sobre el doble búfer esto? Aquí está el código de la ventana principal.

/**
 * 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)
    {

    }
}

OriginalEl autor Ryley Matos | 2012-05-08

4 Kommentare

  1. 17

    Doble búfer es conceptualmente muy simple, en lugar de dibujar los objetos uno por uno, que se dibujan sobre una imagen y luego decirle a la empresa para dibujar que toda la imagen. Esto elimina el parpadeo.

    He aquí un ejemplo de cómo se podría hacer esto (fuente)

    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);
        }
    }

    Hoy en día, usted no tiene que implementar esta usted mismo, usted puede utilizar el BufferStrategy y releated clases. Ver lakam99 de la respuesta para un ejemplo de eso .

    muchas gracias 🙂
    buena respuesta, pero usted no necesita hacer esto como el Swing, ya ofrece el doble búfer. Ver mi respuesta para los detalles….
    Después de ‘pintura(offgc);» ¿cómo la Imagen fuera de la pantalla se actualiza ? No veo la variable fuera de la pantalla para cambiar a cualquier lugar.
    Ver la línea de offgc = offscreen.getGraphics();

    OriginalEl autor dfb

  2. 4

    Swing soporta el doble búfer automáticamente, así que usted no necesita código de nada.

    Acaba de llamar setDoubleBuffered(true) en su componente de nivel superior (normalmente un JPanel) y debería funcionar.

    Ver: setDoubleBuffered

    OriginalEl autor mikera

  3. 2

    Otra solución es utilizar una biblioteca que será el doble búfer para usted. Puesto que usted está utilizando Java2D estoy asumiendo que usted quiere mantener todo muy ligero y de menor nivel. Creo que Slick2D hace un gran trabajo de proporcionar una sencilla, dibujo 2d y funciones de entrada sin ponerse en tu camino. Se siente como una más elegante versión de Java2D, pero está escrito en OpenGL. Una vez que usted hace un par de aplicaciones con Java puro, creo que mudarse a Slick2D es una GRAN idea. Esta no es la solución a su problema, pero desde que ya se ha resuelto pensé Id ofrecemos algunos consejos que harán de su juego Java desarrollo de la vida más fácil. Échale un vistazo si tienes la oportunidad http://slick.cokeandcode.com/

    OriginalEl autor JoeP

  4. 1

    Yo creo que tu problema no es el doble búfer. Debe agregar super.paint(page); en la primera línea de su método paint.

    OriginalEl autor ceklock

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea