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

有一种叫做双缓冲的技术可以让动画看起来更流畅。以下是如何执行此操作的示例:

  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 回答
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,或者您没有清除您的屏幕外缓冲区dbImage

于 2013-08-17T00:44:13.110 回答