0

私はアニメーションを見てきましたが、通常は非常に滑らかできれいに見えますが、私のものを見ると、ゴーストや尻尾があるように見えます. 彼らはまた、途切れ途切れに見えます。何が原因なのかわからず、どうすれば直るかわかりません。ゲーム ループが原因なのか、ペイント メソッドが原因なのかはわかりません。

これは、それがどのように見えるかの短い(スーパーショート)ビデオです

他のゲームのアイテムがとてもうまく動いているのを見たとき、どうすればそれを実現できますか?

@Override
public void paint(Graphics g){
    this.dbImage = createImage(this.getWidth(), this.getHeight());
    this.dbg = dbImage.getGraphics();
    this.paintComponent(dbg);
    g.drawImage(this.dbImage, 0, 0, this);
}

/**
 *
 * @param g
 *
 * Draws out all of the GameObjects in the room
 */
@Override
public void paintComponent(Graphics g){
    try{
        g.drawImage(bg, 0, 0, this);
        for(GameObject go : this.gameObjects){
            g.drawImage(go.getSprite(), go.getX(), go.getY(), this);
        }
        //this.repaint();
    }catch(Exception e){
    }
}

これはpaint()メソッドなしです:

塗装なし

4

2 に答える 2

0

これが私がそれを書く方法です。コメントはプロセスを説明します。

//in constructor, and whenever your component resizes
this.dbImage = createImage(this.getWidth(), this.getHeight());

@Override
public void paint(Graphics g){
    //probably shouldn't have a class instance of graphics.
    Graphics2D dbg = dbImage.createGraphics();
    //clear offscreen buffer image.
    dbg.fillRectangle(0,0,dbImage.getWidth(),dbImage.getHeight());
    //render a new frame to offscreen buffer
    this.paintComponent(dbg);
    //render offscreen buffer to component
    g.drawImage(this.dbImage, 0, 0, this);
    gdb.dispose();
}

編集:

コンポーネント画面をクリアする方法は次のとおりです。

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    //alternatively, g.fillRectangle(0,0,getWidth(),getHeight());

    try{
        g.drawImage(bg, 0, 0, this);
        for(GameObject go : this.gameObjects){
            g.drawImage(go.getSprite(), go.getX(), go.getY(), this);
        }
        //this.repaint();
    }catch(Exception e){
    }
}

投稿したスクリーンショットは、 JComponent をクリアしていないか、 offscreen buffer をクリアしていないようですdbImage

于 2013-08-17T00:44:13.110 に答える
0

アニメーションをより滑らかに見せるダブルバッファと呼ばれるテクニックがあります。これを行う方法のサンプルを次に示します。

  1. タイプ BufferedImage のフィールドを宣言します。 BufferedImage backbuffer

  2. ダブル バッファを作成します。 backbuffer = new BufferedImage(screenWidth, screenHeight, BufferedImage.TYPE_INT_RGB);

  3. BufferedImage によって提供されるグラフィックを使用して、ビューを描画します。 g2d = backbuffer.createGraphics();

    g2d.drawImage(...);

    それが役立つことを願っています。

于 2013-08-17T00:51:26.303 に答える