9

そのため、私が取り組んでいるゲームでは、ビー玉をマウスに追従させていますが、これを行うと画面がちらつきます。

背景には 2 つの 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)
    {

    }
}
4

4 に答える 4

21

ダブル バッファリングは、概念的には非常に単純です。オブジェクトを 1 つずつ描画するのではなく、画像上にオブジェクトを描画してから、その画像全体を描画するようにレンダラーに指示します。これにより、ちらつきが解消されます。

これを行う方法の例を次に示します ( source )

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

現在、これを自分で実装する必要はありません。BufferStrategy と関連するクラスを使用できます。その例については、lakam99 の回答を参照してください。

于 2012-05-08T23:50:41.143 に答える
4

Swing は自動的にダブル バッファリングをサポートするため、何もコーディングする必要はありません。

setDoubleBuffered(true)最上位コンポーネント (通常は JPanel) を呼び出すだけで、すべてが機能するはずです。

見る:setDoubleBuffered

于 2012-05-09T00:42:46.477 に答える
2

もう 1 つの解決策は、ダブル バッファを作成するライブラリを使用することです。あなたはJava2Dを使用しているので、すべてをかなり軽量で低レベルに保ちたいと思っていると思います. Slick2D は、邪魔にならずにシンプルな 2D 描画と入力機能を提供する素晴らしい仕事をしていると思います。Java2D のより洗練されたバージョンのように感じますが、OpenGL で記述されています。Pure Java でいくつかのアプリケーションを作成したら、Slick2D に移行するのは素晴らしいアイデアだと思います。これはあなたの問題に対する直接的な解決策ではありませんが、すでに解決されているので、Java ゲーム開発をより簡単にするためのアドバイスを提供できると思います。機会があればチェックしてみてください http://slick.cokeandcode.com/

于 2012-05-09T23:52:49.357 に答える
2

あなたの問題はダブルバッファリングではないと思います。super.paint(page);paint メソッドの最初の行に追加する必要があります。

于 2012-05-09T00:37:43.813 に答える