2

Google 検索から、この質問が多く聞かれることがわかりますが、私が見つけた解決策のどれも私のためにそれを行っていません. 私は画像を使って Java でゲームを作っています。しかし、フォーム全体が絶えずちらつき、止められません。はい、私はそれを二重にバッファリングし、update() メソッドをオーバーライドしました。これは確かに役に立ちましたが、ちらつきはまだ残っています。ダブルバッファリングで何か間違ったことをしているのか、それともまったく別のものが必要なのかはわかりません。

最初は clearRect() の行に何か関係があるのではないかと思っていましたが、それを削除してもゲームはまだちらつきましたが、もちろん毎回クリアされませんでした。それで、それはまったく役に立ちませんでした。タイマーを遅くすると、ちらつきはほぼ完全になくなりますが、100ms まで遅くする必要がありますが、それでもまだちらつきが発生します。その上、それは単にゲームには遅すぎる. 1 つのタイマーで 10 ミリ秒のタイマーですべてを実行し、別のタイマーで 100 ミリ秒のペイントを実行しようとしましたが、その場合は不安定に見えます。ちらつきはまだ問題ですが、ペイント タイマーを約 30 ミリ秒まで遅くしても滑らかなままです。

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

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

1 に答える 1

9

paint(...)すべてのダブルバッファリングとすべてのSwingグッズが失われるため、JAppletやJFrameなどのトップレベルウィンドウのメソッドに直接ペイントしないでください。代わりpaintComponent(...)に、JAppletに追加するJPanelまたはその他のJComponentから派生したコンポーネント(JComponent自体を含む)のメソッドを描画します。

ここまたはグーグルでこの主題を検索すると、このサイトや他のサイトで何度も質問され、回答されていることがわかります。答えは同じです。

例えば

于 2012-05-04T03:11:18.323 に答える