2012-05-08 5 views
5

私が取り組んでいるゲームでは、大理石をマウスにつけていますが、これを行うと画面がちらつきます。ゲームでJavaのバッファをダブルバッファリングする方法はありますか?

背景には、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) 
    { 

    } 
} 

答えて

16

ダブルバッファリングではなく、一つ一つ、あなたのオブジェクトを描画するの、あなたがイメージ上に描画し、その全体像を描くためにレンダリングを伝え、概念的には非常に単純です。これによりちらつきがなくなります。

は、ここでは、この(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); 
    } 
} 

Nowdaysを行う可能性があります方法の例ですが、あなたがするBufferStrategyとreleatedクラスを使用することができ、自分でこれを実装する必要はありません。その例については、lakam99の答えを参照してください。

+0

ありがとうございます。 –

+0

良い答えですが、スイングは既にダブルバッファリングを提供しているので、これを行う必要はありません。詳細については私の答えを参照してください.... – mikera

+0

@ dfbあなたは '(塗料(オフ));イメージのオフスクリーンはどのように更新されますか?変数のオフスクリーンがどこにでも変わっていくのを私は見ていません。 –

1

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

2

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

トップレベルのコンポーネント(通常はJPanel)のsetDoubleBuffered(true)を呼び出すだけで問題なく動作します。

参照:setDoubleBuffered

2

別の解決策は、あなたのためのバッファが2倍になり、ライブラリを使用することです。 Java2Dを使用しているので、私はあなたが軽量で低レベルのものをすべて保つことを前提としています。私はSlick2Dがあなたのやり方ではなく、シンプルな2次元描画機能と入力機能を提供するという素晴らしい仕事をしていると思います。それはJava2Dのよりエレガントなバージョンのように感じますが、OpenGLで書かれています。純粋なJavaでいくつかのアプリケーションを作成したら、Slick2Dに移行するのは素晴らしい考えです。これはあなたの問題に対する直接的な解決策ではありませんが、既に解決されているので、私はIdがあなたのJavaゲーム開発の生活を楽にするアドバイスを提供していると考えました。チャンスがあればチェックしてくださいhttp://slick.cokeandcode.com/

関連する問題