2012-05-04 8 views
2

Google検索でこの質問に多くの質問が出るのがわかりますが、私が見つけた解決策はありません。私は画像でJavaでゲームを作っています。ゲームには一般的にそのようなものがあるからです。しかし、フォーム全体が絶えずちらつき、私はそれを止めることができません。はい、私はそれをダブルバッファリングし、update()メソッドをオーバーライドし、間違いなく助けている間、ちらつきは依然として続きます。ダブルバッファリングで何か問題が起きているのか、まったく違うものが必要なのか分かりません。Java Image Flickering

最初はclearRect()行と関係があったかもしれませんが、それを削除するとゲームはまだちらつきましたが、もちろん毎回クリアされませんでした。それは全く助けにならなかった。タイマーを遅くすると、ちらつきがほとんど完全に消えてしまいますが、100msまで遅くする必要がありますが、それでもちらつきが残っています。しかも、それは単にゲームにとっては遅すぎるだけです。私は1つのタイマーを10msのタイマーですべてをやってみましたが、ペイントのために100msで別のタイマーを使っていましたが、ちょっと変わったようです。ペイントタイマーは約30msまで遅くしても滑らかになりますが、ちらつきは依然として問題です。

これをちらつきなく10〜30msごとに行う方法が必要です。ダブルバッファリングに似たいくつかの他の方法がありますか?この場合、または私が使用できる何かが良いでしょうか?助けを前にありがとう。あなたはすべてのダブルバッファリングとすべてのSwingグッズを失うよう

public class main extends JApplet implements ActionListener { 
    //This Declares The Variables 
    Graphics2D buffer; 
    Image offscreen; 
    Timer timGame = new Timer(10, this); 
    //other variables 

    public void init(){ 
     //This Creates The Offscreen Buffer Zone 
     offscreen = createImage(getSize().width, getSize().height); 
     buffer = (Graphics2D)offscreen.getGraphics(); 
     //other initialization stuff irrelevant to drawing 
    } 

    public void actionPerformed(ActionEvent evt){ 
     if (evt.getSource() == timGame) 
      runGame(); 
    } 

    private void runGame(){ 
     //Do stuff, move objects 
     repaint(); 
    } 

    public void paint(Graphics g){ 
     super.paint(g); 

     buffer.clearRect(0, 0, getSize().width, getSize().height); 
     //draw stuff to buffer 
     g.drawImage(offscreen, 0, 0, this); 
    } 

    public void update(Graphics gr){ 
     paint(gr); 
    } 
+1

可能重複[JAppletの - にsuper.paint()。フリッカーが発生する](http://stackoverflow.com/questions/7004866/japplet-super-paint-causes-flicker) –

+0

[vsync tearing](http://en.wikipedia.org/wiki/Screen_tearing)が表示されますかすぐに_画面を更新しようとしていますか? 60 Hzのリフレッシュレートはフレームあたり約17ミリ秒になります。 – sarnold

+0

super.paint()ラインをクリアすると問題が解決しました。私はそれがそれのような何か愚かであることを知っていた。私はそれが普通に絵を描くために得たものだと思って、後でそれを倍増させるために戻ってきます。私はPaintComponentも見ていきますが、私は現時点でそれを見て少し忙しいです。うまくいけばそれはあまりにも助けることができる、少なくとも今はちらつきが完全に停止している。私は10msにもタイマーをバンプアップすることができます:)ありがとう。 – Doug

答えて

9

は、JAppletのかのJFrameなどトップレベルウィンドウのpaint(...)方法に直接塗らないでください。代わりに、JAppletに追加するJPanelや他のJComponent由来コンポーネント(JComponent自体を含む)のメソッドpaintComponent(...)を描画します。

ここやGoogleで検索すると、このサイトや他のサイトで何度も何度も尋ねられ、回答されていることがわかります。

+0

うん、やった。 :(:( –

+0

@sarnold:ありがとう、私はそれを修正したと思う。 –

関連する問題