2011-01-22 9 views
0

こんにちは私は小さなゲームを書いていて、ほぼ完成しています。唯一動作しないのはImageBufferです。 10ミリ秒ごとにメソッドrepaint()を呼び出します。私のpaint()メソッドは次のようになります:BufferedImageのちらつきに関する問題

private Graphics2D g2D; 

public void paint (Graphics g) { 
    BufferedImage bimage = ((Graphics2D)g).getDeviceConfiguration().createCompatibleImage(700, 600, Transparency.OPAQUE); 
    g2D = bimage.createGraphics(); 
    g2D.setFont(font);   
    for(Wall wall: walls){ 
     wall.paint(g2D); 
    } 
    g2D.setColor(Color.orange); 
    paddle.paint(g2D); 
    g2D.drawString(score + "", 150,50); 
    g2D.drawString("record: "+topscore , 350,50); 
    g2D.setColor(Color.red); 
    ball.paint(g2D); 
    g.drawImage(bimage,0,0,this); 
} 

しかし、これはちらつきを取り除くようには見えません。バッファリングされたイメージが描画される前に、何らかの形で画面がクリアされていると思います。 誰でもこの問題の解決に手伝ってもらえますか?感謝! ありがとう!

答えて

1

AWTではなくSwingを使用しているかどうかによって、Canvasの代わりにJComponentを拡張する必要があります。これにより、軽量なコンポーネントが得られ、ダブルバッファリングのサポートを実装する必要はありません。次に、オーバーライドされたpaintComponent(..)に、提供されたGraphicsオブジェクトで画像を描画します。

ペイントで毎回新しい互換性のある画像を作成することは大変です(大量のバイトバッファを使用する非常に高価な操作です - 頻繁なGC一時停止が発生します)。 AWTで実際にダブルバッファリングが必要な場合(サイズ変更時に点滅しますが、アプレットであれば問題ありません)、BufferStrategyを調べてください。

編集:私は本当にあなたが投稿コードからやっていることを伝えることはできませんが、私はあなたには、いくつかの移動でいくつかの背景画像をペイントしようとしていることを推測している:)おっと、JComponentのに

+0

申し訳ありませんが、私はJComponentを意味しています:) –

1

をコンポーネントを変更上の画像。もしそうなら、あなたのアプローチは間違っています。

ペイントが呼び出されるたびに背景イメージを再作成する必要はありません。その代わりに、バッファリングされたイメージは、paintComponent()メソッドの外側で一度作成する必要があります。コンポーネントを再描画するときは、最初にイメージを(背景として)ペイントします。次に、パドルとボールを背景の上にペイントします。

また、パドルとボールを表すためにJLabelsを使用することもできます。コンポーネントを移動するには、その位置を変更するだけです。その後、より効率的なバックグラウンド全体ではなく、コンポーネントの古い場所または新しい場所だけを再描画する必要があります。

2

あなたはupdateを上書きする必要があります。

public void update() { 
    paint(); 
} 

updateのデフォルトの実装ではpaintを呼び出す前に、背景色で領域全体を埋め、それがちらつきの原因となっているものです。

+0

オーバーライドとは何ですか?どの基本クラスが拡張されているのかは明らかではない。 –

+0

@StealthRabbi 'update'は' Canvas'で定義されています。 – finnw

関連する問題