图像旋转动画

3
也许是一个简单的问题,我正在尝试制作一艘船的动画(类似于asteroids游戏中的飞船)。目前,我只是使用Graphics2D的rotate方法。但是,现在图像只是变得模糊不清。有什么最简单的方法来解决这个问题并使其正常工作吗?(getImage方法每次屏幕刷新时都会被调用,并且每次用户按左或右键时都会调用rotate方法。bi1是之前读取的bufferedimage)
public void rotate(double rot) {
    g = bi1.getGraphics();
    Graphics2D g2d=(Graphics2D)g;
    g2d.rotate(rot, 15, 15);
    g2d.drawImage(bi1, 0, 0, null);     
}

public BufferedImage getImage() {   
    return bi1;
}

也许这个JavaFX小行星游戏教程可以为你的基于Java的版本提供一些启示。链接 - arttronics
6个回答

2

使用仿射变换来尝试一下:

  public void paint(Graphics g) {
      // clear off screen bitmap
      super.paint(g);
      // cast graphics to graphics 2D
      Graphics2D g2 = (Graphics2D) g;
      AffineTransform tfm = new AffineTransform();
      tfm.rotate(0,0,0);
      g2.setTransform(tfm);
      g2.drawImage(backImage, 0, 0, this);
      tfm.rotate(Math.toRadians(player.angle+90), player.x+32, player.y+32);
      g2.setTransform(tfm);
      g2.drawImage(tank, player.x, player.y, this);       
  }

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/geom/AffineTransform.html


不幸的是,这与使用Graphics2d.rotate()相同,只是它会生成额外的垃圾。Graphics2D具有内置的AffineTransform。如果在同一渲染器中需要多个,则只需要分配自己的即可。 - Gene

2
你可以尝试使用Graphics.setRenderingHint()并设置更高的质量,但除此之外,你无法使其正常工作。如果Graphics2D提供的质量不能满足你的需求,则可以使用图形程序创建旋转图像,并根据飞船的朝向选择正确的预先旋转的图像。这样,质量不再取决于图形API,而仅取决于你的图形程序(以及你在制作旋转图像方面付出的努力)。你必须决定角度的粒度(预渲染图像的数量),通常合理的数字在16到64之间。

1

我同意在Graphics2D.setRenderingHint()上的建议。尝试使用KEY_INTERPOLATIONVALUE_INTERPOLATION_BILINEAR

此外,尝试将源图像放大到实际绘制大小的4倍,然后在旋转时使用Graphics2D.scale(1/multiple)。原因是:如果不进行缩放,像素的对角线长度比边长大1.4倍以上,因此当旋转接近奇数个45度时,图像中的14个以上像素仅参考了原始图像中的10个像素,这会导致结果不平滑。

另一种方法是同时使用BufferedImage作为源和目标:

    tx = new AffineTransform();
    tx.rotate(theta, xCenter, yCenter)
    op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
    BufferedImage destImg = op.filter(srcImg, null);

最后,转换到OpenGL(例如使用JOGL或LWGL)可以提供各种抗锯齿和更多控制。另一方面,它也会打开硬件不兼容性的大门,因为许多图形驱动程序存在OpenGL错误。

0

你可以使用 getRotateInstance(double theta)

public void paint(Graphics g) {
    ...
    Graphics2D g2d = (Graphics2D)bi1.getGraphics();
    AffineTransform af = new AffineTransform(
       AffineTransform.getRotateInstance(theta, x, y));
    g2d.setTransform(af);
    g2d.drawImage(bi1, af, this);
}

docs: AffineTransform (getRotateInstance)


0

0

您正在绘制存储您船舶图像的BufferedImage的图形上下文。

如果您将其绘制到显示游戏的UI组件的图形上下文或其他缓冲区的上下文中,则旋转方法的使用应该有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接